我正在尝试使用Firebase来创建迷你社交媒体。目前有两个组件,一个用于处理登录和注册的loginRegisterViewController,以及一个显示主要内容的TabbarViewcontroler。
在appDelegate的didFinishLaunching方法中,我将TabbarViewcontroler设置为rootView控制器
let rootviewController = TabbarController()
window?.rootViewController = rootviewController
并在TabbarController的viewDidLoad方法中,我实现以下代码以查看是否应该呈现LoginViewController。
class TabbarController: UITabBarController {
var handle : FIRAuthStateDidChangeListenerHandle?
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
// check if the user is logged in or not.
handle = FIRAuth.auth()!.addStateDidChangeListener(){ auth, user in
if user == nil {
self.present(loginRegisterViewController(), animated: true, completion: nil)
}else{
self.setupTabbarController()
}
}
}
}
如果用户已登录,我们设置tabbarViewController,如果用户不是,我们在tabbarViewController之上提供loginRegisterViewController。
但是,每次我注册一个新用户并解除loginRegisterViewController时,我都会得到一个空的tabbarViewController。
我知道这是因为tabbarViewController的viewDidLoad方法中的if-else条件。
由于最初没有用户登录,
self.setupTabbarController()
因此,没有调用方法。因此,在我注册一个新用户并解除loginRegisterViewController后,我得到一个空的tabbarViewController。
但是,我该如何解决这个问题呢?或者是否有更好的方法来检查用户是否登录或不显示mainContentViewController或LoginRegisterViewController?
提前致谢。
编辑:setupTabbarViewController是一个设置tabbarController的函数
func setupTabbarController(){
let shopControler = ViewController()
let shopNavigationControler = UINavigationController(rootViewController: shopControler)
shopNavigationControler.tabBarItem.title = "Shop"
shopNavigationControler.tabBarItem.image = UIImage(named: "Shop_Tabbar_Image")
viewControllers = [newsfeedNavigationControler, shopNavigationControler]
}
答案 0 :(得分:0)
正如您提到的那样,我们需要在登录状态发生变化后再次呼叫self.setupTabbarController()
。
我通常采用这种方式:
创建一个类AuthManager
或类似的东西。这有用户loginState和一个名为configureRootViewController
的函数。
声明一个静态sharedInstance。
在AppDelegate中 - didFinishLaunchWithOptions
:
你的电话看起来有点谎言:
AuthManager.sharedInstance.configureRootViewController()
configureRootViewController()所做的就是检查登录状态并配置正确的rootViewController。
每次登录状态发生变化时,您都想再次调用此方法。
我希望有所帮助。仍然很早就给出了精确的答案。 :-) 祝你有美好的一天。