简而言之
展开 segue(有时称为exit segue )可用于通过 push、modal 或 popover segue 向后导航(就像您从导航栏中弹出导航项、关闭弹出框或关闭模态呈现的视图控制器一样)。最重要的是,您实际上不仅可以通过一个,而且可以通过一系列推送/模态/弹出框来展开,例如,通过单个展开动作“返回”导航层次结构中的多个步骤。
当你执行一个 unwind segue 时,你需要指定一个 action,它是你想要 unwind 到的 view controller 的一个 action 方法。
目标-C:
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}
迅速:
@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}
当您在情节提要中创建展开转场时,将使用此操作方法的名称。此外,此方法在执行 unwind segue 之前调用。您可以从传递的UIStoryboardSegue
参数中获取源视图控制器,以与启动 segue 的视图控制器进行交互(例如,获取模态视图控制器的属性值)。在这方面,该方法具有与 的prepareForSegue:
方法类似的功能UIViewController
。
iOS 8 更新: Unwind segues 也适用于 iOS 8 的自适应 segues,例如Show和Show Detail。
一个例子
让我们有一个带有导航控制器和三个子视图控制器的故事板:
从绿色视图控制器,您可以展开(导航返回)到红色视图控制器。从蓝色您可以放松到绿色或通过绿色到红色。要启用展开,您必须将特殊的操作方法添加到 Red 和 Green,例如,这里是 Red 中的操作方法:
目标-C:
@implementation RedViewController
- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}
@end
迅速:
@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}
添加操作方法后,您可以通过控制拖动到退出图标来定义情节提要中的展开转场。在这里,我们想在按下按钮时从绿色放松到红色:
您必须选择要展开的视图控制器中定义的操作:
您还可以从蓝色放松到红色(在导航堆栈中“两步之遥”)。关键是选择正确的展开动作。
在执行 unwind segue 之前,会调用 action 方法。在示例中,我定义了从 Green 和 Blue 到 Red 的 unwind segue。我们可以通过 UIStoryboardSegue 参数在 action 方法中访问 unwind 的来源:
目标-C:
- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
UIViewController* sourceViewController = unwindSegue.sourceViewController;
if ([sourceViewController isKindOfClass:[BlueViewController class]])
{
NSLog(@"Coming from BLUE!");
}
else if ([sourceViewController isKindOfClass:[GreenViewController class]])
{
NSLog(@"Coming from GREEN!");
}
}
迅速:
@IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) {
if let blueViewController = unwindSegue.sourceViewController as? BlueViewController {
println("Coming from BLUE")
}
else if let redViewController = unwindSegue.sourceViewController as? RedViewController {
println("Coming from RED")
}
}
展开也可以通过推/模态segues的组合来工作。例如,如果我添加另一个带有模态 segue 的 Yellow 视图控制器,我们可以一步从 Yellow 一直放松到 Red:
从代码中解脱出来
当您通过控制拖动某些东西到视图控制器的退出符号来定义展开转场时,文档大纲中会出现一个新的转场:
选择 segue 并转到 Attributes Inspector 会显示“Identifier”属性。使用它为您的 segue 提供唯一标识符:
在此之后,可以像任何其他 segue 一样从代码中执行展开 segue:
目标-C:
[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];
迅速:
performSegueWithIdentifier("UnwindToRedSegueID", sender: self)