在Xcode Storyboard中使用Unwind SegueclosuresPopover

我正在使用Xcode 4.5和新的iOS 6function来解开赛道。 我在一个popup窗口中提供了一个导航视图控制器,它是通过一个条形button项目以编程方式呈现的:

- (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 { // } 

…并将其连接到导航视图控制器导航栏中的取消button。

连接取消栏button到cancelConfigbutton在Xcode中工作得很好。

然而,当运行代码时,尽pipeXcode 4.5应该支持在展开segues(根据发布文档)时支持取消popovers,但单击Cancelbutton时没有任何反应。

我错过了什么?

谢谢!

Unwind segues使用运行时search,首先要求父视图控制器沿着通过segue呈现的视图控制器链,直到find正确的展开方法。 但是这里没有链,因为popover是以编程的方式创build的,而不是popover的。

没有callback发生,因为没有segue链接回到父视图控制器。 放松赛是一种抽象的委托forms,所以这与忘记设置委托并且不接收任何callback相似。

解决方法是在Interface Builder中使用segue创buildconfigChartTapped:而不是使用configChartTapped:方法以编程方式创build它。

脚步:

首先,将控件从呈现视图控制器中的栏button项拖动到呈现的视图控制器,并selectpopup窗口:

在这里输入图像说明

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

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

在这里输入图像说明

这将允许您放松cancelConfig:从popup窗口点击取消button时,也显示/隐藏popup时,点击显示它的button。