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.有一个按钮" Back"在B.所以当我从B回来时我想去A所以为此,当D到B然后我想要从堆栈而不是A和B清除所有视图viewcontroller。 问题:我无法获得堆叠的视图控制器列表。
答案 0 :(得分:0)
使用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'展开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的ViewController堆栈。
希望有所帮助
答案 1 :(得分:0)
您可以使用
获取viewcontrollers数组let viewControllers: [UIViewController] = self.navigationController!.viewControllers
然后,您可以使用popToViewController函数弹出到特定的viewcontroller。例如
self.navigationController!.popToViewController(viewControllers[2], animated: true)
答案 2 :(得分:0)
UINavigationController
将其视图控制器保存在navigationController.viewControllers
属性中,该属性是一个数组。
let viewControllers = navigationController.viewControllers
print(viewControllers)
您可以检查该值以查看导航堆栈。