导航控制器如何弹出整个堆栈,包括根

Posted

技术标签:

【中文标题】导航控制器如何弹出整个堆栈,包括根【英文标题】:Navigation controller how to pop entire stack, including root 【发布时间】:2018-07-05 13:12:28 【问题描述】:

我正在学习协调器模式。我有几个登录视图控制器。一旦用户完成登录,我想弹出整个导航堆栈并将我的主视图控制器设置为根。可行吗?

我的解决方法是将一个空的视图控制器设置为根,所以我可以做popToRootViewController,然后将 main vc 添加为子级。但这看起来并不干净。

【问题讨论】:

问题是如何? 【参考方案1】:

更改viewControllers 属性

 let vc = ///
 self.navigationController?.viewControllers = [vc]   

【讨论】:

是否可以为上一个堆栈离开屏幕的方式设置动画?就像淡出【参考方案2】:

如果您想完全移除并替换整个堆栈,只需重新启动流程即可。

设置一个新的导航控制器和AppCoordinator,并将导航控制器分配给window.rootViewController。就像在启动时一样在 AppCoordinator 上调用 start 并且您有一个新堆栈。

您可以在 AppCoordinator 上添加一个方法来为您处理此问题

class AppCoordinator: Coordinator, NSObject 

    var navigationController: UINavigationController

    init(navigationController: UINavigationController) 
        self.navigationController = navigationController
    

    func start() 
       let vc = MainViewController()
       navigationController.setViewControllers([vc], animated: true)
    

    func resetNavigationStack() 

        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else 
            return
        

        navigationController = UINavigationController()
        appDelegate.window = navigationController
        start()
    


【讨论】:

以上是关于导航控制器如何弹出整个堆栈,包括根的主要内容,如果未能解决你的问题,请参考以下文章

如何从导航堆栈中推送/弹出uiviewcontroller时收到警报

在导航控制器中弹出到根视图

当视图控制器弹出或推入导航控制器堆栈时如何获得通知

如何阻止片段一直弹出到根片段? [导航组件]

如何在没有导航控制器的情况下管理 UITableViews 堆栈

弹出到根视图控制器,没有表视图的动画崩溃