首页 > 解决方案 > 如果 FirebaseAuth 为空,我如何转到“登录”视图控制器?

问题描述

我对 Swift 非常陌生,并且设置非常简单。有一个登录屏幕,如果用户使用正确的凭据登录,他们会转到选项卡栏中的第一个 VC。

从登录到标签栏视图控制器的转换工作正常,但是当我加载应用程序时,如果 currentUser 为 nil,我不会进入登录屏幕。

这是我在标签栏中的第一个 VC 中的检查:

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    if Auth.auth().currentUser == nil {
      goToLogin()
    }
}

这是同一个VC中的功能去登录

func goToLogin() {
    let loginViewController = storyboard?.instantiateViewController(identifier: Constants.Storyboard.loginViewController) as? LoginViewController

    view.window?.rootViewController = loginViewController
    view.window?.makeKeyAndVisible()
}

我的登录 VC 的故事板 ID 是“loginViewController”,标签栏控制器是我的初始视图控制器

更新 我在 App Delegate 中的身份验证检查如下所示:

if Auth.auth().currentUser == nil {
        // considering the StoryboardID is same as View Controllers name.
        self.makeRootVC(storyBoardName: "Main", vcName: Constants.Storyboard.loginViewController)
       } else {
        self.makeRootVC(storyBoardName: "Main", vcName: Constants.Storyboard.homeTabBarController)
       }

但我从“homeTabBarController”收到此错误:

类型“Constants.Storyboard”没有成员“homeTabBarController”

homeTabBarController 是主故事板中我的标签栏控制器的 StoryboardId。那么为什么不被认可呢?

标签: swiftfirebasefirebase-authentication

解决方案


你应该做这个签入didFinishLaunchingWithOptionsAppDelegate不是签入ViewController。您可以使用以下函数来更改您的根视图控制器。

AppDelegate.swift中

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    if Auth.auth().currentUser == nil {
        // considering the StoryboardID is same as View Controllers name. 
        self.makeRootVC(storyBoardName: "Main", vcName: Constants.Storyboard.loginViewController)
       } else { 
        self.makeRootVC(storyBoardName: "Main", vcName: Constants.Storyboard.yourTabBarController)
       }
    return true
}


func makeRootVC(storyBoardName : String, vcName : String) {
        let vc = UIStoryboard(name: storyBoardName, bundle: Bundle.main).instantiateViewController(withIdentifier: vcName)
        let nav = UINavigationController(rootViewController: vc)
        nav.navigationBar.isHidden = true
        self.window?.rootViewController = nav
        let options: UIView.AnimationOptions = .transitionCrossDissolve
        let duration: TimeInterval = 0.6
        UIView.transition(with: self.window!, duration: duration, options: options, animations: {}, completion: nil)
    }

推荐阅读