如何从堆栈中弹出视图控制器而不导航到它们

时间:2016-12-08 14:35:02

标签: ios swift

基本上,我有3个视图控制器,A,B和C.A和B都有一个后退按钮,当用户向后导航时,它会将顶视图控制器弹出堆栈。但是,一旦用户将其转到C,就没有选项可以倒退,我想在发生这种情况时将A和B从堆栈中弹出而不实际向后导航到A和B,因为这会导致其他地方的后退按钮出现问题应用程序,因为堆栈上有剩余的元素。你怎么建议这样做?

我不想尝试导航回弹出的视图控制器。

4 个答案:

答案 0 :(得分:6)

您可以设置viewControllers的{​​{1}}属性,如果您想要设置转换动画,也可以。

navigationController

navigationController?.viewControllers = []

在你的例子中,当你到达C时,你有

navigationController?.setViewControllers([], animated: true)

一旦你进入C就会从堆栈中删除A和B ..你可能必须把它放在navigationController?.viewControllers = [self]中,但要确保你只做一次,除非你想让它冲洗堆栈每次C最终都出现在屏幕上。

viewDidAppear

或者当您即将推送到C时,您可以尝试代替var initialLoad:Bool = true override func viewDidLoad() { super.viewDidLoad() } override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) if initialLoad { initialLoad = false navigationController?.viewControllers = [self] } }

pushViewController

我相信会推动你前进,然后从堆栈中删除A和B.有时取决于堆栈的当前状态,即通过

动画弹出窗口

答案 1 :(得分:0)

您还可以将视图控制器“C”设置为rootViewController,这样无论您在“C”之后的任何位置点击返回按钮,它都会降为“C”。

答案 2 :(得分:0)

将其添加到C视图控制器代码

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if let vc = self.storyboard?.instantiateViewController(withIdentifier: "vc") as? ViewController, self.navigationController?.viewControllers.count == 3, self.navigationController!.viewControllers[0].isKind(of: <#A_CLASS_OBJ#>), self.navigationController!.viewControllers[1].isKind(of: <#B_CLASS_OBJ#>) {

        let navVC = UINavigationController(rootViewController: vc)
        navVC.navigationBar.isHidden = true
        navVC.automaticallyAdjustsScrollViewInsets = false

        UIApplication.shared.delegate?.window??.rootViewController = navVC
        UIApplication.shared.delegate?.window??.makeKeyAndVisible()
    }
}

答案 3 :(得分:0)

您可以删除A&amp;来自导航堆栈的B没有向后导航,如下所示:

let controllersInStack = self.navigationController?.viewControllers

for viewController in controllersInStack!{
    if( viewController.isKind(of: ViewControllerA) || viewController.isKind(of: ViewControllerB) ){
        viewController.removeFromParentViewController()
    }
}