我对编程很陌生,这就是为什么我无法真正弄清楚如何解决这个问题。我已经在应用程序委托中实现了一个 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 中也会显示黑屏。...
有谁知道为什么会这样?