在Xcode Storyboard中使用Unwind Segue关闭Popover

Ale*_*exR 4 objective-c uipopovercontroller ios uistoryboardsegue xcode4.5

我正在使用Xcode 4.5和新的iOS 6功能来展开segues.我在弹出窗口中呈现导航视图控制器,该控制器以编程方式从条形按钮项目呈现:

- (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];
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个方法旁边,我已经定义了一个目标来展开segue(即解雇popover)......

- (IBAction)cancelConfig:(UIStoryboardSegue *)segue
{
    //
}
Run Code Online (Sandbox Code Playgroud)

...并将其连接到导航视图控制器导航栏中的取消按钮.

将取消栏按钮连接到cancelConfig按钮在Xcode中正常工作.

但是,在运行代码时,单击"取消"按钮时没有任何反应,尽管Xcode 4.5应该支持在展开segues时解除弹出窗口(根据发布文档).

我错过了什么?

谢谢!

Bry*_*uby 5

展开segues使用运行时搜索首先要求父视图控制器向上走通过segue呈现的视图控制器链,直到找到正确的展开方法.但是这里没有链条,因为popover是以编程方式创建的,而不是使用popover segue.

由于没有segue链接返回到父视图控制器,因此不会发生回调.展开segue是一种抽象形式的委托,因此这类似于忘记设置委托而不接收任何回调.

解决方案是在Interface Builder中使用segue创建popover,而不是使用该configChartTapped:方法以编程方式创建它.

脚步:

首先,从呈现视图控制器中的条形按钮项目控制拖动到呈现的视图控制器并选择弹出窗口:

在此输入图像描述

呈现视图控制器中,实现prepareForSegue:获取对弹出控制器的引用:

- (void)prepareForSegue:(UIStoryboardPopoverSegue *)segue
                 sender:(id)sender {
    self.popover = segue.popoverController;
}
Run Code Online (Sandbox Code Playgroud)

然后实现shouldPerformSegueWithIdentifier:恢复显示/隐藏行为类似于configChartTapped::

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    if (self.popover.isPopoverVisible) {
        [self.popover dismissPopoverAnimated:YES];
        return NO;
    } else {
        return YES;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,在Interface Builder中,为呈现的视图控制器设置正确的弹出框内容大小:

在此输入图像描述

这将允许您在cancelConfig:从弹出框中点击取消按钮时展开,并在点击呈现它的按钮时显示/隐藏弹出框.