以编程方式继续检索堆栈的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堆栈手动的时候,你可以用适当的结构像segue
和unwind segue
和popToRootViewController
类似的方法来实现。
希望能帮助到你