在Xcode Storyboard中使用Unwind Segue关闭Popover

时间:2012-11-19 15:48:38

标签: objective-c ios uipopovercontroller xcode4.5 uistoryboardsegue

我正在使用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];
    }
}

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

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

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

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

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

我错过了什么?

谢谢!

1 个答案:

答案 0 :(得分:5)

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

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

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

<强>步骤:

首先,控制 - 从呈现视图控制器中的条形按钮项目拖动到呈现的视图控制器并选择popover segue:

enter image description here

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

- (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中,为呈现的视图控制器设置正确的弹出框内容大小:

enter image description here

这样,您可以在点击弹出框中的取消按钮时放松到cancelConfig:,并在点击显示弹出按钮时显示/隐藏弹出框。