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


当前回答

供你参考:为了让@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,它会被忽略。

其他回答

供你参考:为了让@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,它会被忽略。

向后兼容的解决方案,将工作于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;
        }
    }
}

Swift 4.2, Xcode 10+

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

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

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

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


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

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

我使用[self disdisviewcontrolleranimated: YES completion: nil];它会将你返回到调用ViewController。

下面是Objective C和Swift的完整答案:

1)在你的目标视图控制器(你想要segue到的地方)中创建一个IBAction unwind segue。在实现文件中的任何位置。

// Objective C

    - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

2)在源视图控制器(你正在从中segue的控制器)上,⌃+从“activity Name”中拖动退出。你应该在弹出窗口中看到步骤1中创建的unwind segue。(如果你没有发现,请回顾第一步)。从弹出窗口中选择unwindToContainerVC:或者任何你命名的方法来连接你的源控制器到unwind IBAction。

3)在故事板的源视图控制器的文档大纲中选择segue(它将在底部附近列出),并给它一个标识符。

4)用这个方法从源视图控制器调用unwind segue,替换你的unwind segue名。

// Objective C

[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];

/ /快速

赛尔夫。举报者。

NB。使用unwind方法上segue参数的sourceViewController属性来访问源控制器上的任何公开属性。另外,请注意,框架处理解除源控制器。如果您想确认这一点,请向源控制器添加一个dealloc方法,并附上一条日志消息,该日志消息应该在源控制器被杀死后触发。如果dealloc不火,你可能有一个保留周期。