如何回到rootviewcontroller

时间:2017-08-22 13:59:37

标签: ios swift cocoa-touch segue

我有四个视图控制器A,B,C和D

我从A到B到C到D

 let newViewContoller: B = self.storyboard?.instantiateViewControllerWithIdentifier("B") as! B    
 self.presentViewController(newViewContoller, animated: true, completion:nil)

从D回到A

我正在使用以下

self.view.window!.rootViewController?.dismissViewControllerAnimated(true, completion: nil)

我面临的问题是, 正在调用viewController B和viewController C的viewDidAppear

我不知道为什么会这样?回到最初UIViewController的正确方法是什么。

2 个答案:

答案 0 :(得分:1)

您的ViewControllers A,B,C和D处于堆栈数据结构中,它实现后进先出。这意味着要通过关闭ViewControllers来访问ViewController A,它将按此顺序弹出ViewControllers D,C,B。在这种情况下,从堆栈弹出的ViewControllers C和B将是瞬间最顶级的ViewController,它将触发viewWillAppear()和viewWillDissapear()函数。 Apple文档:

  

在堆栈下方的视图控制器上调用此方法会解除其直接子视图控制器以及堆栈上该子级上方的所有视图控制器。

相反,如果你有一个导航控制器并且不希望出现C和B,你应该做的是从当前显示的viewController(D)popToRootViewController(),它将弹出当前然后dealloc C和B和然后显示A.

答案 1 :(得分:0)

据我所知,一次解雇4个控制器是不可能的,但这是一个棘手的方法 -

从Viewcontroller D 创建一个segue到viewcontroller A ,将其称为ForceSegue,然后你应该在 A 上有一些东西控制器执行此操作,如果它的动作粘贴以下.. 的目标c

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

Swift 3

performSegue(withIdentifier: "ForceSegue", sender: self)

只是一个棘手的方式, 希望这有帮助!