【发布时间】:2018-10-27 19:26:03
【问题描述】:
我正在设计一个应用程序,当用户第一次打开它并且他们当前已登录时,我希望它对他们的数据进行快照,然后根据条件实例化一个视图控制器。
在我的示例中,如果用户是“驱动程序”,这意味着 firebase 中的值为“true”,那么我希望他们转到“驱动程序”视图控制器。如果用户不是“驱动程序”,那么我希望他们转到“用户”视图控制器(TabBarVC)。如果用户为 nil 或未登录,则他们转到登录 VC。
我已经测试了没有条件的代码。如果用户已登录(无快照),则转到 TabBarVC,如果用户已注销,则转到 Login VC。
当运行带有条件的应用程序时,应用程序崩溃并说“应用程序窗口在应用程序启动结束时应该有一个根视图控制器”,这对我来说意味着它没有读取我的使用 FireBase 快照中的条件时的代码。
请让我知道我做错了什么,我认为“rootVC”会起作用,因为它是“var rootVC : UIViewController?”形式的变量
这里是 switcher.swift
import Foundation
import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase
class Switcher {
static func updateRootVC() {
var rootVC : UIViewController?
let currentUser = Auth.auth().currentUser?.uid
if Auth.auth().currentUser != nil{
DataService.instance.REF_USERS.child(currentUser!).observeSingleEvent(of: .value, with: { (snapshot) in
if let userSnapshot = snapshot.children.allObjects as? [DataSnapshot] {
for user in userSnapshot {
if user.childSnapshot(forPath: "driver_profile/is_userdriver").value as? Bool == false {
rootVC = UIStoryboard(name: "Driver", bundle: nil).instantiateViewController(withIdentifier: "DriverHomeVC") as! DriverHomeVC
} else {
rootVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "TabBarVC")
return
}
}
}
})
// rootVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "TabBarVC")
// rootVC = UIStoryboard(name: "Driver", bundle: nil).instantiateViewController(withIdentifier: "DriverHomeVC") as! DriverHomeVC
}else{
rootVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginVC") as! LoginVC
}
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = rootVC
}
}
这是 AppDelegate.swift 的一部分,如果您需要了解它是如何调用的:
import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase
import FirebaseInstanceID
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
override init() {
FirebaseApp.configure()
Database.database().isPersistenceEnabled = true
}
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
Switcher.updateRootVC()
return true
}
【问题讨论】:
-
看看Firebase Async 和这个较旧但仍然相关的答案ViewController loads early
-
@Jay 我会检查一下。
标签: swift firebase firebase-realtime-database viewcontroller