注销用户时如何切换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() 

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

这很容易解决,你需要传递一个ViewController实例,你可以从你的登录故事板获取,这样:

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

若要工作,在登录情节提要中,需要将视图控制器设置为初始视图控制器

如果情节提要已经具有导航控制器,则可以将视图控制器实例传递给 rootViewController,如下所示:

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

希望这有帮助。

最新更新