我有一个NavigationController,下面的VC嵌入其中: VC1 -> VC2 -> VC3 -> VC4 -> VC5。我的问题是,当我从VC5 (编辑完成后)返回到VC3时,我希望以编程的方式将VC4和VC5从堆栈中抛出,也就是说,当用户被送回VC3时,我希望在navagitionBar中“返回”将您带到VC2 (而不是您真正来自的VC5 )。
这在IOS中出现了很多,您想要编辑模型,然后将它们发送回tableView/Collection视图,但是既然编辑已经完成,您就不再希望导航堆栈中的viewControllers编辑了,因为它对UX太混乱了。
在下面的截图中,右上角的VC是VC5:

通过PinViewController (VC3)通过self.performSegueWithIdentifier("backToPins", sender: self)返回到
我该怎么做?
发布于 2016-04-24 15:05:03
不要用segue回来(流行)。
您应该使用popToViewController并传递特定的viewcontroller作为参数来弹出该视图控制器。
例如,如果你想在第三视图控制器中选择五个,那么你可以做如下的事情。您可以将索引从视图控制器数组更改为不同的视图控制器。
let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];
self.navigationController!.popToViewController(viewControllers[viewControllers.count - 3], animated: true);如果使用segue,这意味着向导航堆栈中添加(推)新视图控制器。在您的示例中,到达第五视图后的堆栈如下,
VC1 - VC2 - VC3 - VC4 - VC5 (top of stack)
如果您执行返回VC3的任务,那么堆栈应该是这样的,
VC1 - VC2 - VC3 - VC4 - VC5 - VC3(top of stack)
如果你弹到VC3,你的堆栈就像,
VC1 - VC2 - VC3 (top of stack)。
所以弹出视图的人要回去不要使用segue
希望这会有所帮助:)
发布于 2016-04-24 21:22:13
最好的方法是通过松开海格。
在VC3中,您定义了一个适当的展开函数:
@IBAction func unwind(segue:UIStoryboardSegue) {
    if let sourceViewController = segue.sourceViewController as? VC5 {
         let myNewData=sourceViewController.someProperty
         self.someFunctionThatUpdatesScene()
}然后,在VC5场景中,您可以通过两种方式之一创建一个展开子格。
如果希望直接从对象(如UIButton )触发它,则可以从检查器中的action拖动到场景顶部的exit图标,然后从弹出窗口中选择unwind。
如果要以编程方式触发展开,则从左侧资源管理器中的视图控制器对象拖动到退出图标,然后从弹出窗口中选择unwind。现在,您将在资源管理器中看到一个展开的segue,您可以给它一个标识符,就像使用任何segue一样。可以将此标识符与performSegueWithIdentifier一起使用。
这种方法的优点是,您不需要对UINavigationController堆栈的深度做出任何假设,也不需要实现委托/协议来返回数据。
苹果在使用松开垫圈上有一个很好的技术说明
https://stackoverflow.com/questions/36824524
复制相似问题