4

我正在使用 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(即解除弹出窗口)......

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

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

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

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

我错过了什么?

谢谢!

4

1 回答 1

5

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

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

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

脚步:

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

在此处输入图像描述

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

在此处输入图像描述

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

于 2013-02-07T22:27:33.150 回答