什么时候应该设置 rootViewController?很困惑

Posted

技术标签:

【中文标题】什么时候应该设置 rootViewController?很困惑【英文标题】:When should I set rootViewController? it's very confused 【发布时间】:2020-12-22 19:10:00 【问题描述】:

您好,我正在为 rootViewController 苦苦挣扎,我留下了一些代码片段,下面有解释,请告诉我。

如果我像下面那样做,它可以工作并且一切都很好。

    private func presentLogin() 
        log.info("presenting login..")
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let vc = storyboard.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
        vc.modalPresentationStyle = .fullScreen
        appDelegate.window!.rootViewController = vc
        present(vc, animated: false)
    

然后,如果我执行下面的代码,ios 只显示白色空白页..

    private func presentMain() 
        log.info("presenting main..")
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let vc = storyboard.instantiateViewController(withIdentifier: "MainTabBarController") as! MainTabBarController
        vc.modalPresentationStyle = .fullScreen
        appDelegate.window!.rootViewController = vc
        present(vc, animated: false)
    

但是当我删除代码时

appDelegate.window!.rootViewController = vc

一切都很好。

换句话说,下面的代码只在第一次工作。

appDelegate.window!.rootViewController = vc

为什么?我错过了什么?,我不明白..

【问题讨论】:

【参考方案1】:

好像有很多bugs关于根视图控制器的交换。切换根视图控制器也是一种不常见的“导航”方式。我会推荐一种不同的方法:

应用启动时,使用“启动”视图控制器。这是您的根视图控制器,它始终是您的根视图控制器 如果需要登录,则显示登录视图控制器 成功登录后,关闭登录视图并继续 如果已登录,则显示主应用程序的入口视图

【讨论】:

以上是关于什么时候应该设置 rootViewController?很困惑的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 SwiftUI Lifecycle 中将 rootViewController 设置为 UIHostingController 时会出错?

rootViewController 需要澄清

设置 appdelegate' 窗口 rootviewcontroller

从 rootViewController 设置 UILabel 文本

如何将 tabBarController 设置为 rootViewController

以编程方式使用 UINavigationController 设置 RootViewController