简而言之
一个开卷赛格瑞(有时也被称为出口SEGUE)可用于通过推,模态或酥料饼塞格斯导航回(如,如果你从导航栏弹出导航项,关闭酥料饼或驳回模态呈现视图控制器)。最重要的是,您实际上不仅可以解开一个推入/模态/弹出窗口序列,而且可以通过单个解开动作“导航”导航层次结构中的多个步骤。
当执行展开搜索时,需要指定一个动作,这是您要展开到的视图控制器的动作方法。
目标C:
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}
迅速:
@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}
在情节提要中创建展开序列时,将使用此操作方法的名称。此外,此方法在执行展开搜索之前被调用。您可以从传递的UIStoryboardSegue
参数中获取源视图控制器,以与启动segue的视图控制器进行交互(例如,获取模态视图控制器的属性值)。在这方面,该方法也有类似功能的prepareForSegue:
方法UIViewController
。
iOS 8更新: Unwind segues也可以与iOS 8的自适应segues一起使用,例如Show和Show Detail。
一个例子
让我们有一个带有导航控制器和三个子视图控制器的情节提要:
您可以从Green View Controller展开(向后导航)到Red View Controller。从蓝色,您可以展开为绿色或通过绿色为红色。要启用展开,必须将特殊的操作方法添加到红色和绿色中,例如,这是红色中的操作方法:
目标C:
@implementation RedViewController
- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}
@end
迅速:
@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}
添加动作方法后,您可以通过按住Control键并拖动到“退出”图标来定义情节提要中的展开序列。在这里,我们想在按下按钮时从绿色退到红色:
您必须选择要在视图控制器中展开的动作:
您还可以从蓝色展开为红色(在导航堆栈中“相隔两步”)。关键是选择正确的展开动作。
在执行展开搜索之前,将调用action方法。在示例中,我定义了从绿色和蓝色到红色的展开顺序。我们可以通过UIStoryboardSegue参数在action方法中访问展开源:
目标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")
}
}
放卷还可以通过组合推/模态搜索来完成。例如,如果我添加了另一个带有模态搜索的Yellow视图控制器,我们可以在一个步骤中从Yellow一直退回到Red:
从代码中解脱
通过控制将某些内容拖到视图控制器的“退出”符号上来定义展开序列时,新的序列会出现在“文档大纲”中:
选择segue并转到“属性”检查器,将显示“标识符”属性。使用它为您的segue提供唯一的标识符:
之后,可以像其他任何segue一样从代码中执行展开segue:
目标C:
[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];
迅速:
performSegueWithIdentifier("UnwindToRedSegueID", sender: self)
dismissViewControllerAnimated:completion:
或popViewControllerAnimated:
实现同样的事情?