如何以编程方式执行Unwind segue?
使用故事板这很容易。 您只需将动作拖动到“退出”。 但是,我应该如何从我的代码中调用它?
- 创build一个手动segue( ctrl -drag从文件的所有者退出),
- 在绿色EXITbutton下方的左侧控制器菜单中select它。
插入塞恩的名字放松。
然后, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.
与您的segue识别。
Objective C和Swift的完整答案如下:
1)创build一个IBAction
在你的目标视图控制器中展开segue(你想要继续)。 执行文件中的任何地方。
// Objective C - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue { } // Swift @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) { }
2)在源代码视图控制器(您正在继续的控制器)上,从“活动名称”拖动退出。 您应该看到popup窗口中步骤1中创build的展开顺序。 (如果您没有看到,请查看第一步)。 selectunwindToContainerVC:从popup窗口或者任何你命名你的方法来连接你的源代码控制器到展开IBAction。
3)在源视图控制器的故事板的文档大纲(将在底部附近列出)中selectsegue,并给它一个标识符 。
4)从源视图控制器使用此方法调用unwind segue,replaceunwind segue名称。
// Objective C
[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];
// Swift
self.performSegueWithIdentifier("unwindToContainerVC", sender: self)
NB。 使用unwind方法上的segue参数的sourceViewController属性来访问源控制器上的任何公开属性。 此外,请注意框架处理解雇源控制器。 如果您想确认这一点,请向源控制器添加一个dealloc方法,并使用日志消息,该消息一旦被终止,就会触发。 如果dealloc不启动,你可能有一个保留周期。
bradleygriffith
的回答非常好。 我走了第10步,做了简化的截图。 这是Xcode 6中的屏幕截图。
简单地控制 – 从橙色图标拖动到红色的退出图标,创build一个展开,没有任何行动/button在视图中。
然后selectunwind segue
并设置一些标识符以从代码访问它。
在代码中,
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
我用[self dismissViewControllerAnimated: YES completion: nil];
这将返回到调用ViewController
。
从Apple的技术说明中引用文本Unwind Segue:要添加一个只能以编程方式触发的unwind segue,请从场景的视图控制器图标控制拖动到其退出图标,然后从popup菜单中为新的segueselect展开动作。
链接到技术说明
上面的Vishal Chaudhry的回答为我工作。 我还要补充说,为了手动触发seque使用:
[self performSegueWithIdentifier:@"mySegueName" sender:self];
在ViewController中,您还必须在故事板的ViewController的Scene中selectunwind segue,并在RHS的属性视图中确保Indentifier字段包含您在代码中引用的名称(以上示例中的“mySegueName” )。
如果你省略了这一步,上面的这行就会抛出一个例外,即seque名字是不知道的。
向后兼容的解决scheme,可用于ios6之前的版本,对于那些感兴趣的用户:
- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated { for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) { UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i]; if ([vc isKindOfClass:vcClass]) { [self.navigationController popToViewController:vc animated:animated]; return; } } }
仅供参考:为了使@ Vadim的答案与View Controller中调用的手动展开序列动作一起工作,您必须放置以下命令:
[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];
在重写类方法viewDidAppear内部像这样:
-(void) viewDidAppear:(BOOL) animated { [super viewDidAppear: animated]; [self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self]; }
如果你把它放在其他ViewController方法,如viewDidLoad或viewWillAppear ,它将被忽略。