objective-c - 在 Xcode Storyboard 中使用 Unwind Segue 关闭 Popover

标签 objective-c ios uipopovercontroller xcode4.5 uistoryboardsegue

我正在使用 Xcode 4.5 和新的 iOS 6 功能来解除转场。我在一个弹出框内呈现一个导航 View Controller ,它是从一个条形按钮项目以编程方式呈现的:

- (IBAction)configChartTapped:(id)sender
{
    if (self.popover.isPopoverVisible) {

        [self.popover dismissPopoverAnimated:YES];

    } else {
        UINavigationController *chartConfigNavigationController = [self.storyboard instantiateViewControllerWithIdentifier:@"GrowthChartNavigationController"];

        ConfigChartTypeViewController *configChartTypeViewController = (ConfigChartTypeViewController*) chartConfigNavigationController.topViewController;

        self.popover = [[UIPopoverController alloc]initWithContentViewController:chartConfigNavigationController];
        self.popover.popoverContentSize = CGSizeMake(320, 500);
        self.popover.delegate = self;

        [self.popover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }
}

在这个方法旁边,我定义了一个目标来展开 segue(即关闭弹出窗口)...

- (IBAction)cancelConfig:(UIStoryboardSegue *)segue
{
    //
}

...并将其连接到导航 View Controller 的导航栏中的取消按钮。

将取消栏按钮连接到取消配置按钮在 Xcode 中工作正常。

但是,在运行代码时,尽管 Xcode 4.5 应该支持在展开 segue 时关闭弹出窗口(根据发布文档),但单击“取消”按钮时没有任何反应。

我错过了什么?

谢谢!

最佳答案

Unwind segues 使用运行时搜索,首先要求父 View Controller 遍历通过 segue 呈现的 View Controller 链,直到找到正确的 unwind 方法。但是这里没有链,因为 popover 是通过编程方式创建的,而不是使用 popover segue。

没有回调发生,因为没有返回到父 View Controller 的 segue 链接。 Unwind segues 是委托(delegate)的抽象形式,因此这类似于忘记设置委托(delegate)并且没有收到任何回调。

解决方案是在 Interface Builder 中使用 segue 创建弹出窗口,而不是使用 configChartTapped: 方法以编程方式创建它。

步骤:

首先,按住 control 从 presenting View Controller 中的条形按钮项拖动到 presented View Controller ,然后选择 popover segue:

enter image description here

presenting View Controller 中,实现 prepareForSegue: 以获取对 popover Controller 的引用:

- (void)prepareForSegue:(UIStoryboardPopoverSegue *)segue
                 sender:(id)sender {
    self.popover = segue.popoverController;
}

然后执行shouldPerformSegueWithIdentifier:来恢复 类似于 configChartTapped::

的显示/隐藏行为
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    if (self.popover.isPopoverVisible) {
        [self.popover dismissPopoverAnimated:YES];
        return NO;
    } else {
        return YES;
    }
}

最后,在 Interface Builder 中,为 presented View Controller 设置正确的 popover 内容大小:

enter image description here

这将允许您在点击弹出窗口中的取消按钮时放松到 cancelConfig:,并在点击显示弹出窗口的按钮时显示/隐藏弹出窗口。

关于objective-c - 在 Xcode Storyboard 中使用 Unwind Segue 关闭 Popover,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13457296/

相关文章:

ios - UIAutomation:如何访问UIPopoverController?

ios - 根据文本长度自定义 UIButton 调整大小,然后放置 UILabel

ios - 发送带有 "Body Requests"的 NSMutableURLRequest 请求

objective-c - Fabric macOS 异常有时没有被捕获?

ios - Firebase 和推送通知/云消息传递

ios - UIPopoverController 出现在错误的位置

ios - Xcode 6 错误?添加 iPhone 6/6 Plus LaunchImage 更改应用程序约束

ios - Xcode Instruments 中的总字节数达到 1 GB 可以吗?

iphone - iOS:对齐两个 UILabel(左/右)并用点连接?

ipad - 来自 MKAnnotation 标注的 UIPopOver