使用故事板非常简单。你只需将动作拖到“退出”。但是如何从代码中调用它呢?


当前回答

向后兼容的解决方案,将工作于ios6之前的版本,为那些感兴趣:

- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {

    for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
        UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
        if ([vc isKindOfClass:vcClass]) {
            [self.navigationController popToViewController:vc animated:animated];
            return;
        }
    }
}

其他回答

引用苹果关于Unwind Segue的技术说明: 要添加一个只会被编程触发的unwind segue,从场景的视图控制器图标control+拖动到它的退出图标,然后从弹出菜单中为新segue选择一个unwind动作。

技术说明链接

Swift 4.2, Xcode 10+

对于那些不知道如何通过故事板建立风险投资的人(那些从搜索“程序化”+“unwind segue”中得到这个问题的人)。

鉴于你不能通过编程方式设置unwind segue,最简单的纯编程解决方案是调用:

导航控制器?。popToRootViewController(动画:真)

它会弹出堆栈上的所有视图控制器回到你的根视图控制器。


要从导航堆栈中弹出最顶层的视图控制器,使用:

导航控制器?。会被(动画:真)

向后兼容的解决方案,将工作于ios6之前的版本,为那些感兴趣:

- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {

    for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
        UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
        if ([vc isKindOfClass:vcClass]) {
            [self.navigationController popToViewController:vc animated:animated];
            return;
        }
    }
}

斯威夫特4:

1. 在你想unwind到的控制器中创建一个@IBAction segue:

    @IBAction func unwindToVC(segue: UIStoryboardSegue) {

    }

2. 在故事板中,从你想要segue (unwind)的控制器中,从ctrl+拖动从控制器符号到退出符号并选择你之前创建的方法:

3.现在你可以注意到在文档大纲中你有了新的标题为“Unwind segue....”的行。现在您应该单击这一行并打开属性检查器来设置标识符(在我的示例中是unwindSegueIdentifier)。

4. 你快完成了!现在你需要打开你想要unwind的视图控制器并创建一些执行segue的方法。例如,你可以添加按钮,用@IBAction的代码连接它,然后在IBAction中添加perfromSegue(withIdentifier:sender:)方法:

     @IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
         performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
     }

这就是你要做的一切!

供你参考:为了让@Vadim的答案与视图控制器中调用的手动unwind seque动作一起工作,你必须放置命令:

[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];

在被重写的类方法viewDidAppear内部,如下所示:

-(void) viewDidAppear:(BOOL) animated
{
    [super viewDidAppear: animated];

    [self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}

如果你把它放在其他ViewController方法中,比如viewDidLoad或viewWillAppear,它会被忽略。