0

我对编程很陌生,这就是为什么我无法真正弄清楚如何解决这个问题。我已经在应用程序委托中实现了一个 rootviewcotnroller,这样如果用户登录,他就会被直接推送到应用程序内容而不是登录视图控制器。然而它并没有真正起作用。如前所述,我将以下代码添加到应用程序委托中:

    window = UIWindow(frame: UIScreen.main.bounds)
    window?.makeKeyAndVisible()
    window?.rootViewController = MainViewController()

MainViewcontroller 设置如下:

class MainViewController: UINavigationController {

override func viewDidLoad() {
    super.viewDidLoad()
    if isLoggedIn() {
        let homeController = UserViewController()
        viewControllers = [homeController]

    }else {

        perform(#selector(showLoginController), with: nil, afterDelay: 0.01)
    }
}

fileprivate func isLoggedIn() -> Bool {
    return UserDefaults.standard.isLoggedIn()
}

func showLoginController() {
    let loginController = LoginViewController()
    present(loginController, animated: true, completion: {

    })
 }
}

在 Userviewcontroller 中,我添加了以下几行:

 func handleSignout() {

    UserDefaults.standard.setisLoggedIn(value: false)
    print("is logged out")

}

@IBAction func SignOut(_ sender: Any) {

    handleSignout()
    if FIRAuth.auth()!.currentUser != nil {

        do {
        try? FIRAuth.auth()?.signOut()

            if FIRAuth.auth()?.currentUser == nil {
                let loginViewViewcontroller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Login") as! LoginViewController
                self.present(loginViewViewcontroller, animated: true, completion: nil)
            }
        }   
    }
}

然后我创建了一个带有 UserDefaults 的扩展来保存布尔值,无论用户是登录还是注销:

extension UserDefaults {

enum UserDefaultKeys: String {
    case isLoggedIn
}

func setisLoggedIn(value: Bool) {
    set(false, forKey: UserDefaultKeys.isLoggedIn.rawValue)
    synchronize()   
}

func isLoggedIn() -> Bool {
    return bool(forKey: UserDefaultKeys.isLoggedIn.rawValue)
}

}

在 LoginviewController 中,如果第一眼看到它只会显示黑屏,我添加了:

  func finishLoggingIn() {

    let rootViewController = UIApplication.shared.keyWindow?.rootViewController
    guard let MainNavigationController = rootViewController as? MainViewController else {return}
    MainNavigationController.viewControllers = [UserViewController()]
    print("is logged in")
    UserDefaults.standard.setisLoggedIn(value: true)

    dismiss(animated: true, completion: nil)

}

当用户按下登录按钮时调用此函数。

该应用程序会识别用户是否已登录,但无论用户是否已登录,所显示的第一个视图控制器都会显示黑屏,这很可能是登录视图控制器,但如果用户已登录如果是要呈现的第一个视图控制器,则在 userviewcontroller 中也会显示黑屏。...

有谁知道为什么会这样?

4

1 回答 1

1

我已经想出了如何解决它。这比我预期的要容易得多。也许我找到的解决方案不是最好的方法,但只要它有效,我就很高兴!

我使用 UserDefaults 删除了所有功能。在我的 MainViewController 中,我刚刚添加了 Firebase 本身建议的以下代码:

import UIKit
import FirebaseAuth

 // DIeser Viewcontroller wird immer als erstes aufgerufen und entscheidet, ob der loginviewcontroller gestartet wird oder  der UserViewController gestartet wird. 

class MainViewController: UINavigationController {


override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .white

    FIRAuth.auth()?.addStateDidChangeListener() { (auth, user) in
        if user != nil {

            let LoginVc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "usersVC")

            self.present(LoginVc, animated: true, completion: nil)

        }else {

            let UserVc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginVc")

            self.present(UserVc, animated: true, completion: nil)
        }
    }
  }
}

MainViewController 仍然设置为 AppDelegate 中的 rootviewcontroller。我希望我将来能帮助别人!

于 2017-04-03T21:08:04.663 回答