ios6和Xcode 4.5有一个叫做“Unwind Segue”的新功能:

Unwind segue允许转换到故事板中已有的场景实例

除了Xcode 4.5发布说明中的这个简短条目,UIViewController现在似乎有了几个新方法:

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier

unwind segue是如何工作的,它们可以用来做什么?


当前回答

斯威夫特iOS:

步骤1:在MASTER控制器视图中定义这个方法。其中你想要返回:

//pragma mark - Unwind Seques
@IBAction func goToSideMenu(segue: UIStoryboardSegue) {

    println("Called goToSideMenu: unwind action")

}

(StoryBoard)右键单击SLAVE/CHILD EXIT按钮,选择“gotosidemmenu”作为连接按钮,单击该按钮将返回到主控制器视图:

步骤3:构建并运行…

其他回答

例如,如果你从viewControllerB导航到viewcontrollerera,那么在你的viewcontrollerera下面的委托就会调用,数据就会共享。

@IBAction func unWindSeague (_ sender : UIStoryboardSegue) {
        if sender.source is ViewControllerB  {
            if let _ = sender.source as? ViewControllerB {
                self.textLabel.text = "Came from B = B->A , B exited"
            }
            
        }

}

Unwind Seague源视图控制器(你需要连接退出按钮到VC的退出图标,并将其连接到unwindseague:

viewControllerA的TextLabel被改变。

我在其他答案中没有看到的当你不知道初始segue的来源时如何处理unwind,这对我来说是更重要的用例。例如,假设你有一个帮助视图控制器(H),你从两个不同的视图控制器(a和B)中modal地显示:

A→h B→h

你如何设置unwind segue让你回到正确的视图控制器?答案是你在A和B中声明一个同名的unwind动作,例如:

// put in AViewController.swift and BViewController.swift
@IBAction func unwindFromHelp(sender: UIStoryboardSegue) {
    // empty
}

通过这种方式,unwind会找到哪个视图控制器(A或B)发起了segue并回到它。

换句话说,unwind动作描述的是segue的来源,而不是它的去向。

Unwind segue被用来“返回”到某个视图控制器,从这个视图控制器中,通过一些segue,你会到达“当前”视图控制器。

想象你有一个MyNavController a是它的根视图控制器。现在你使用push segue到B,现在导航控制器在它的viewControllers数组中有a和B, B是可见的。现在你用模态方式来表示C。

使用unwind segue,你现在可以从C unwind回B(即解散模态呈现的视图控制器),基本上是“撤消”模态segue。你甚至可以unwind到根视图控制器A,撤销模态segue和push segue。

Unwind segue使回溯变得容易。例如,在iOS 6之前,解散呈现的视图控制器的最佳实践是将呈现的视图控制器设置为呈现的视图控制器的委托,然后调用你的自定义委托方法,然后解散presenttedviewcontroller。听起来又麻烦又复杂?这是。这就是unwind segue很好的原因。

斯威夫特iOS:

步骤1:在MASTER控制器视图中定义这个方法。其中你想要返回:

//pragma mark - Unwind Seques
@IBAction func goToSideMenu(segue: UIStoryboardSegue) {

    println("Called goToSideMenu: unwind action")

}

(StoryBoard)右键单击SLAVE/CHILD EXIT按钮,选择“gotosidemmenu”作为连接按钮,单击该按钮将返回到主控制器视图:

步骤3:构建并运行…

至于如何在StoryBoard中使用unwind segue…

步骤1)

转到你想要unwind到的视图控制器的代码并添加这个:

objective - c

- (IBAction)unwindToViewControllerNameHere:(UIStoryboardSegue *)segue {
    //nothing goes here
}

一定要在你的.h文件中用Obj-C声明这个方法

斯威夫特

@IBAction func unwindToViewControllerNameHere(segue: UIStoryboardSegue) {
    //nothing goes here
}

步骤2)

在故事板中,到你想unwind的视图把segue从按钮拖到源视图右上方的橙色EXIT图标。

现在应该有一个选项连接到"- unwindToViewControllerNameHere"

就是这样,你的segue会在按钮被点击时unwind。