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

时间:2017-06-13 05:52:26

标签: ios objective-c iphone swift xcode

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。 问题:我无法获得堆叠的视图控制器列表。

3 个答案:

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

当你可以使用segueunwind 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)

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