简而言之
解环(unwind segue)(有时也称为退出环(segue))可用于通过推送、模态或弹出的转场方式向后导航(就像从导航栏中弹出导航项,关闭弹出窗口或关闭模态呈现的视图控制器一样)。此外,您实际上可以通过一系列推送/模态/弹出转场步骤进行解环,例如:使用单个解环操作“返回”导航层次结构中的多个步骤。
当执行解环转场时,您需要指定一个操作,这是您希望解环到达的视图控制器的动作方法。
Objective-C:
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}
Swift:
@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}
该操作方法的名称在创建Storyboard中的Unwind Segue时使用。此外,在执行Unwind Segue之前,该方法会被调用。您可以从传递的UIStoryboardSegue参数中获取源视图控制器以与启动Segue的视图控制器进行交互(例如,获取模态视图控制器的属性值)。在这方面,该方法具有类似UIViewController的prepareForSegue:方法的功能。
iOS 8更新:Unwind Segue也适用于iOS 8的自适应Segue,例如Show和Show Detail。
一个例子:
让我们拥有一个故事板,其中包含一个导航控制器和三个子视图控制器。
从绿色视图控制器,您可以跳转回红色视图控制器。从蓝色视图控制器,您可以通过绿色视图控制器跳转回红色视图控制器或直接跳转回红色视图控制器。要启用退回功能,必须将特殊的操作方法添加到红色和绿色视图控制器中。以下是Red中的操作方法:
Objective-C:
@implementation RedViewController
- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}
@end
Swift:
@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}
在添加操作方法后,您可以通过控制拖动到Exit图标,在Storyboard中定义unwind segue。在此示例中,当按下按钮时,我们希望从绿色返回到红色:
![enter image description here](https://istack.dev59.com/rOlfW.webp)
您必须选择在要返回的视图控制器中定义的操作:
![enter image description here](https://istack.dev59.com/H03n7.webp)
您也可以从“导航堆栈”中“两步之遥”的蓝色返回到红色。关键是选择正确的unwind action。
在执行unwind segue之前,将调用操作方法。在本例中,我定义了一个从绿色和蓝色返回到红色的unwind segue。我们可以通过UIStoryboardSegue参数在操作方法中访问unwind的源:
Objective-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!");
}
}
Swift:
@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")
}
}
使用推进/模态过渡的组合也可以进行反向跳转。例如,如果我添加了另一个黄色视图控制器并使用模态跳转,我们就可以在单个步骤中从黄色返回到红色:
![enter image description here](https://istack.dev59.com/oWb8u.webp)
从代码中反向跳转
当您通过将某些内容拖动到视图控制器的“退出”符号来定义反向跳转时,文档大纲中会出现一个新的segue:
![enter image description here](https://istack.dev59.com/7Wx7u.webp)
选择该segue并进入属性检查器,可以看到“标识符”属性。使用此属性为您的segue命名:
![enter image description here](https://istack.dev59.com/dsqQh.webp)
完成后,就可以像执行其他segue一样从代码中执行反向segue:
Objective-C:
[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self]
Swift:
performSegueWithIdentifier("UnwindToRedSegueID", sender: self)
dismissViewControllerAnimated:completion:
或popViewControllerAnimated:
这样的方法不能实现相同的效果吗? - Sam SpencerdismissViewControllerAnimated:completion:
或popViewControllerAnimated:
相比,另一个优势是你所添加到要解除的视图控制器中的方法会被调用,因此你有一种简单的方式来知道所呈现的视图控制器已经完成,而无需将呈现视图控制器设置为所呈现视图控制器的委托。 - honus