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中有一个“Back”按钮。所以当我从B回来时我想去A所以为此,当D到B然后我想要从堆栈而不是A和B清除所有视图viewcontroller。问题:我无法获得堆叠视图控制器的列表。
UINavigationController
将其视图控制器保存在navigationController.viewControllers
属性中,该属性是一个数组。
let viewControllers = navigationController.viewControllers
print(viewControllers)
您可以检查该值以查看导航堆栈。
您可以使用查看控件的数组
let viewControllers: [UIViewController] = self.navigationController!.viewControllers
然后,您可以使用popToViewController函数弹出到特定的viewcontroller。例如
self.navigationController!.popToViewController(viewControllers[2], animated: true)
使用unwind segue :)
您无需手动清除viewController的堆栈。将展开的segue从B拖到A.这就是你需要的全部:)
编辑:
我相信你已经混淆了UnwindSegue的概念。展开segue不仅仅是从一个视图控制器跳到另一个视图控制器的方式。当你从ViewController B执行Unwind segue到View Controller A时,不仅会加载ViewController A,而且所有中间的ViewControllers也会被分配。
这是证明:)
我的ViewController A的ViewwillAppear
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print(self.navigationController?.viewControllers.count ?? 0)
}
我的ViewController A是unwind segue
@IBAction func unwindToA(segue: UIStoryboardSegue) {
//perform whatever u have to do before unwind segue completes
}
这是我的流程。
VCA -pushes-> VCB -pushes-> VCC
然后我从VCC到VCA解开segue。正如预期的那样,在执行unwindSegue时,VCA的viewWillAppear会被调用。正如预期的那样,navigationController的viewController计数为1.这是我的VCA。显然,VCB与VCC一起被解除分配。
你可以编写dealloc / deinit来确认释放:)
最后,当你可以通过像segue
和unwind segue
以及popToRootViewController
这样的方法实现相同的结果时,永远不要手动使用NavigationController View Controller堆栈。
希望能帮助到你