以编程方式继续检索堆栈的ViewController

static func showMenuView(parentVC:UIViewController){ let storyboard = UIStoryboard(name: "Main", bundle: nil) let resultController = storyboard.instantiateViewController(withIdentifier: "menuViewController") as? MenuViewController; let segue:DragDownSettingSegue = DragDownSettingSegue.init(identifier: "", source: parentVC, destination: resultController); parentVC.prepare(for: segue, sender: nil); segue.perform(); } 

我以编程方式继续查看控制器。 ViewController A到B,然后B到C,然后C到D,然后是D到B.在B中有一个button“返回”。所以我想从A回到B时,所以为了这个,当D到B然后我想清除所有视图viewcontroller从堆栈而不是A和B.问题:我无法得到堆叠视图控制器的列表。

UINavigationController将其视图控制器保存在navigationController.viewControllers属性中,该属性是一个数组。

 let viewControllers = navigationController.viewControllers print(viewControllers) 

您可以检查该值以查看导航堆栈。

你可以使用viewcontrollers的数组

 let viewControllers: [UIViewController] = self.navigationController!.viewControllers 

然后你可以使用popToViewController函数popup到特定的viewcontroller。 例如

 self.navigationController!.popToViewController(viewControllers[2], animated: true) 

使用放松segue 🙂

您不需要手动清除viewController的堆栈。 从B中拖动一个展开的segue到A.那就是你需要的:)

编辑:

我相信你已经混淆了UnwindSegue的概念。 放松segue不仅仅是从一个视图控制器跳到另一个视图控制器的方式。 当您从ViewController B执行Unwind segue到View Controller A时,不仅ViewController A会被加载,而且所有介于其间的ViewController也将被分配。

这是certificate:)

我的ViewController A的ViewwillAppear

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) print(self.navigationController?.viewControllers.count ?? 0) } 

我的ViewController A的放松继续

 @IBAction func unwindToA(segue: UIStoryboardSegue) { //perform whatever u have to do before unwind segue completes } 

这是我的stream程。

VCA-推 – > VCB-推 – > VCC

然后,我把VCC从VCA放到VCA。 所以如预期的执行unwindSegue VCA的视angular将会被召唤。 和预期的一样,navigationController的viewController计数是1.哪个是我的VCA。 所以显然,VCB与VCC一起被释放。

你可以编写dealloc / deinit来确认释放:)

最后不要乱用NavigationController的ViewController堆栈手动的时候,你可以用适当的结构像segueunwind seguepopToRootViewController类似的方法来实现。

希望能帮助到你