简而言之
unwind segue(有时称为exit segue)可用于通过push、modal或弹窗segue导航返回(就像你从导航栏弹出导航项、关闭弹窗或解散模态呈现的视图控制器一样)。在此之上,你实际上可以通过不止一个而是一系列的push/modal/popover segue来展开。“返回”导航层次结构中的多个步骤,只需一个展开操作。
当你执行unwind segue时,你需要指定一个动作,这是你想unwind到的视图控制器的一个动作方法。
objective - c:
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}
迅速:
@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}
当您在故事板中创建unwind segue时,将使用此操作方法的名称。而且,这个方法在unwind segue执行之前被调用。你可以从传入的UIStoryboardSegue参数中获得源视图控制器,以与发起segue的视图控制器交互(例如,获得模态视图控制器的属性值)。在这方面,该方法的功能类似于UIViewController的prepareForSegue:方法。
iOS 8更新:Unwind segue也适用于iOS 8的自适应segue,比如Show和Show Detail。
一个例子
让我们有一个带有导航控制器和三个子视图控制器的故事板:
从绿色视图控制器你可以unwind(返回)到红色视图控制器。从蓝色你可以放松到绿色或通过绿色到红色。为了启用unwind,你必须在Red和Green中添加特殊的动作方法,例如下面是Red中的动作方法:
objective - c:
@implementation RedViewController
- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}
@end
迅速:
@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}
在添加了操作方法之后,您可以通过control-drag到Exit图标来定义故事板中的unwind segue。在这里,我们想要在按下按钮时从绿色unwind到红色:
你必须选择你想要unwind到的视图控制器中定义的动作:
您还可以从Blue(在导航堆栈中“两步远”)unwind到Red。关键是选择正确的展开动作。
在unwind segue被执行之前,action方法被调用。在这个例子中,我定义了一个从Green和Blue unwind到Red的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!");
}
}
迅速:
@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")
}
}
unwind也可以通过push/modal segue的组合来工作。例如,如果我用modal segue添加另一个黄色视图控制器,我们可以在一个步骤中从黄色unwind回红色:
从代码中展开
当你通过control-拖动某个东西到视图控制器的Exit符号来定义unwind segue时,一个新的segue会出现在文档大纲中:
选择segue并转到属性检查器显示“Identifier”属性。使用这个给你的segue一个唯一的标识符:
在此之后,unwind segue可以像其他segue一样从代码中执行:
objective - c:
[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];
迅速:
performSegueWithIdentifier("UnwindToRedSegueID", sender: self)