以编程方式定义新的导航控制器订单/堆栈?

时间:2016-04-24 14:38:39

标签: ios swift uinavigationcontroller

我有NavigationController以下VC嵌入:VC1 - > VC2 - > VC3 - > VC4 - > VC5。我的问题是,当我从VC5中删除时(编辑完成后),我将你送回VC3,但我想以编程方式将VC4和VC5从堆栈中抛出,即当用户被送回VC3时,我想&# 34;背面"在navagitionBar中带你去VC2(而不是你真正来自的VC5)。

在IOS中出现了很多,你想要编辑模型,然后将它们发送回tableView / Collection视图,但是由于编辑完成,你不希望编辑viewControllers在导航堆栈中因为它太过混乱了用户体验。

在下面的屏幕截图中,右上角的VC是VC5:enter image description here,它通过self.performSegueWithIdentifier("backToPins", sender: self)

返回到PinViewController(VC3)

我该怎么做?

2 个答案:

答案 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

上有一个非常好的技术说明