我有NavigationController
以下VC嵌入:VC1 - > VC2 - > VC3 - > VC4 - > VC5。我的问题是,当我从VC5中删除时(编辑完成后),我将你送回VC3,但我想以编程方式将VC4和VC5从堆栈中抛出,即当用户被送回VC3时,我想&# 34;背面"在navagitionBar
中带你去VC2(而不是你真正来自的VC5)。
在IOS中出现了很多,你想要编辑模型,然后将它们发送回tableView / Collection视图,但是由于编辑完成,你不希望编辑viewControllers在导航堆栈中因为它太过混乱了用户体验。
在下面的屏幕截图中,右上角的VC是VC5:,它通过self.performSegueWithIdentifier("backToPins", sender: self)
我该怎么做?
答案 0 :(得分:1)
不要使用segue
返回(弹出)。
你应该使用popToViewController
并传递特定的viewcontroller
作为参数来弹出那个viewcontroller。
例如,如果您想要使用5个中的第3个视图控制器,那么您可以执行以下操作。你可以只从viewcontroller数组更改索引到不同的视图控制器。
let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];
self.navigationController!.popToViewController(viewControllers[viewControllers.count - 3], animated: true);
如果您使用segue,则表示您将新的viewcontroller添加(推送)到导航堆栈。在您的示例中,到达第5个视图后的堆栈就像是,
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)
。
所以流行的viewcintrollers回去不要使用segue
希望这会有所帮助:)
答案 1 :(得分:1)
这样做的最好方法是通过展开segue。
在VC3
中,您可以定义适当的展开功能:
@IBAction func unwind(segue:UIStoryboardSegue) {
if let sourceViewController = segue.sourceViewController as? VC5 {
let myNewData=sourceViewController.someProperty
self.someFunctionThatUpdatesScene()
}
然后在VC5场景中,你可以用两种方式之一创建一个展开segue。
如果您希望直接从对象(例如UIButton)触发它,则从检查器中的action
拖动到场景顶部的exit
图标,然后选择{{ 1}}来自弹出窗口。
如果要以编程方式触发展开,则从左侧资源管理器中的视图控制器对象拖动到退出图标,然后从弹出窗口中选择unwind
。现在,您将在资源管理器中看到一个展开的segue,您可以像使用任何segue一样给它一个标识符。您可以将此标识符与unwind
这种方法的优点是您不需要对UINavigationController堆栈的深度做任何假设,并且您不需要实现委托/协议来传回数据。
Apple在Using Unwind Segues
上有一个非常好的技术说明