在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。