首页 > 解决方案 > 注销用户时如何切换 UINavigationController 的根视图控制器(Swift 5)

问题描述

我正在努力使我的初始根视图控制器是HomeViewController. 然后我运行一个代码来检查用户(我正在使用 Firebase)是否已经登录。如果用户未登录,则根视图控制器将更改为LoginViewController并以模态方式显示登录/注册屏幕,然后在用户登录后释放这些 VC。

func authenticateUserConfigureView() {

    if Auth.auth().currentUser == nil {
        DispatchQueue.main.async {
            let navController = UINavigationController(rootViewController: LoginViewController)
            navController.navigationBar.barStyle = .default
            self.present(navController, animated: true, completion: nil)
        }
    } else{
        configureViewComponents()
    }

}

好像如果我编写代码会rootViewController: LoginViewController显示此错误

无法将“LoginViewController.Type”类型的值转换为预期的参数类型“UIViewController”

或者,如果我这样写LoginViewController(),尽管用户似乎被定向到登录视图控制器,但模拟器会立即崩溃。

更新

我尝试使用

let homeViewController = self.storyboard?.instantiateViewController(identifier: Constants.Storyboard.homeViewController) as? HomeViewController
        view.window?.rootViewController = homeViewController
        view.window?.makeKeyAndVisible() 

但似乎什么都没有发生(尽管它似乎在运行)。顺便说一句,我正在使用主故事板来创建我的视图控制器。

标签: iosswiftgoogle-cloud-firestoreuinavigationcontrollerswift5

解决方案


解决起来很简单,你需要传递一个 ViewController实例,你可以从你的 Login StoryBoard 中获取,这样:

    let loginViewController = UIStoryboard (name: "LoginStoryboardName", bundle: Bundle.main).instantiateInitialViewController()
    let navController = UINavigationController(rootViewController: loginViewController )
    UIApplication.shared.keyWindow?.rootViewController = navController 

要工作,在Login storyboard中,您的 viewController 需要设置为InitialViewController

如果你的 Storyboard 已经有一个 NavigationController,你可以将 ViewController实例传递给 rootViewController,这样:

    let viewController = UIStoryboard (name: "LoginStoryboardName", bundle: Bundle.main).instantiateInitialViewController()
    UIApplication.shared.keyWindow?.rootViewController = viewController

希望这可以帮助。


推荐阅读