如何以编程方式执行Unwind segue?

使用故事板这很容易。 您只需将动作拖动到“退出”。 但是,我应该如何从我的代码中调用它?

  1. 创build一个手动segue( ctrl -drag从文件的所有者退出),
  2. 在绿色EXITbutton下方的左侧控制器菜单中select它。

在绿色EXIT按钮下方的左侧控制器菜单中选择它

插入塞恩的名字放松。

然后, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender. 与您的segue识别。

Objective C和Swift的完整答案如下:

1)创build一个IBAction在你的目标视图控制器中展开segue(你想要继续)。 执行文件中的任何地方。

 // Objective C - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue { } // Swift @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) { } 

2)在源代码视图控制器(您正在继续的控制器)上,从“活动名称”拖动退出。 您应该看到popup窗口中步骤1中创build的展开顺序。 (如果您没有看到,请查看第一步)。 selectunwindToContainerVC:从popup窗口或者任何你命名你的方法来连接你的源代码控制器到展开IBAction。

在这里输入图像说明

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

在这里输入图像说明

4)从视图控制器使用此方法调用unwind segue,replaceunwind segue名称。

// Objective C

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

// Swift

self.performSegueWithIdentifier("unwindToContainerVC", sender: self)

NB。 使用unwind方法上的segue参数的sourceViewController属性来访问源控制器上的任何公开属性。 此外,请注意框架处理解雇源控制器。 如果您想确认这一点,请向源控制器添加一个dealloc方法,并使用日志消息,该消息一旦被终止,就会触发。 如果dealloc不启动,你可能有一个保留周期。

bradleygriffith的回答非常好。 我走了第10步,做了简化的截图。 这是Xcode 6中的屏幕截图。

简单地控制 – 从橙色图标拖动到红色的退出图标,创build一个展开,没有任何行动/button在视图中。

在这里输入图像说明

然后selectunwind segue并设置一些标识符以从代码访问它。

在这里输入图像说明

在代码中,

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

我用[self dismissViewControllerAnimated: YES completion: nil]; 这将返回到调用ViewController

从Apple的技术说明中引用文本Unwind Segue:要添加一个只能以编程方式触发的unwind segue,请从场景的视图控制器图标控制拖动到其退出图标,然后从popup菜单中为新的segueselect展开动作。

链接到技术说明

上面的Vishal Chaudhry的回答为我工作。 我还要补充说,为了手动触发seque使用:

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

在ViewController中,您还必须在故事板的ViewController的Scene中selectunwind segue,并在RHS的属性视图中确保Indentifier字段包含您在代码中引用的名称(以上示例中的“mySegueName” )。

如果你省略了这一步,上面的这行就会抛出一个例外,即seque名字是不知道的。

向后兼容的解决scheme,可用于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; } } } 

仅供参考:为了使@ Vadim的答案与View Controller中调用的手动展开序列动作一起工作,您必须放置以下命令:

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

在重写类方法viewDidAppear内部像这样:

 -(void) viewDidAppear:(BOOL) animated { [super viewDidAppear: animated]; [self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self]; } 

如果你把它放在其他ViewController方法,如viewDidLoadviewWillAppear ,它将被忽略。