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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以编程方式进行segueing时检索ViewControllers堆栈相关的知识,希望对你有一定的参考价值。

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

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

希望能帮助到你

以上是关于以编程方式进行segueing时检索ViewControllers堆栈的主要内容,如果未能解决你的问题,请参考以下文章

如何将 segue 标识符添加到以编程方式进行的模态转换?

在没有按钮连接的情况下以编程方式执行 Segue?

如何使用 Swift 在 iOS 中以编程方式进行 segue

以编程方式从 collectionView 内的自定义 tableView 中进行 Segue

为啥我没有成功以编程方式使用 segue?

以编程方式从 UIView 执行 Segue