【问题标题】:Dismiss Popover using Unwind Segue in Xcode Storyboard在 Xcode Storyboard 中使用 Unwind Segue 关闭 Popover
【发布时间】:2012-11-07 13:56:57
【问题描述】:

我正在使用 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
{
    //
}

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

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

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

我错过了什么?

谢谢!

【问题讨论】:

  • 您好,您找到解决方案了吗?我也卡在这里了
  • Dan,很遗憾我还没有找到解决这个问题的方法。我仍在使用普通的委托,希望苹果能尽快解决这个问题。找到解决方案后请告诉我。

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


【解决方案1】:

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

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

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

步骤:

首先,从 presenting 视图控制器中的 bar button item 按住 control 拖动到 presented 视图控制器,然后选择 popover segue:

presenting 视图控制器中,实现 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:,并在点击显示它的按钮时显示/隐藏弹出框。

【讨论】:

猜你喜欢
  • 2014-07-24
  • 2015-02-10
  • 2012-09-29
  • 2014-12-08
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
相关资源
最近更新 更多