swift - 如果 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。那么为什么不被认可呢?
解决方案
你应该做这个签入didFinishLaunchingWithOptions
而 AppDelegate
不是签入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)
}
推荐阅读
- delphi - 如何同时拥有 Tooltip 和 Hint 提示模式?
- html - 我需要将右侧的 2 行(2018 年和 2017 年)分开,以便有一些空格。有很多麻烦
- javascript - 重定向到 Page.aspx 重定向到未定义
- azure - 如何使我的仪表板小部件呈现为条形图而不是表格 - Azure 仪表板
- python - Pandas:当另外两列是唯一对时,从一列复制值
- spring-cloud-stream - 流应用中的瓶颈导致消息丢失
- docker - 在 docker-compose down、up、stop 中抛出错误。(命名卷 X 用于服务 Y,但在卷部分中未找到声明。)
- flask - 通过 Airflow Web 身份验证登录显示错误页面
- node.js - javascript 对象的查询字符串
- python - 计算销售额滚动(滞后和领先)差异的最佳方法是什么?