如何以编程方式管理app中的loginViewControllers?

时间:2016-12-20 16:04:46

标签: ios swift firebase firebase-authentication

我正在尝试使用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]
}

1 个答案:

答案 0 :(得分:0)

正如您提到的那样,我们需要在登录状态发生变化后再次呼叫self.setupTabbarController()

我通常采用这种方式:

创建一个类AuthManager或类似的东西。这有用户loginState和一个名为configureRootViewController的函数。 声明一个静态sharedInstance。

在AppDelegate中 - didFinishLaunchWithOptions: 你的电话看起来有点谎言: AuthManager.sharedInstance.configureRootViewController()

configureRootViewController()所做的就是检查登录状态并配置正确的rootViewController。

每次登录状态发生变化时,您都想再次调用此方法。

我希望有所帮助。仍然很早就给出了精确的答案。 :-) 祝你有美好的一天。