以编程方式进行segueing时检索ViewControllers堆栈

问题描述 投票:-1回答:3
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。问题:我无法获得堆叠视图控制器的列表。

ios objective-c iphone swift xcode
3个回答
0
投票

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

let viewControllers = navigationController.viewControllers
print(viewControllers)

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


0
投票

您可以使用查看控件的数组

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

然后,您可以使用popToViewController函数弹出到特定的viewcontroller。例如

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

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是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来确认释放:)

最后,当你可以通过像segueunwind segue以及popToRootViewController这样的方法实现相同的结果时,永远不要手动使用NavigationController View Controller堆栈。

希望能帮助到你