gpt4 book ai didi

ios - Viewcontroller 在实现 rootviewcontroller 后只显示黑屏

转载 作者:行者123 更新时间:2023-11-29 00:25:22 25 4
gpt4 key购买 nike

我对编程还很陌生,这就是为什么我无法真正弄清楚如何解决这个问题。我在应用程序委托(delegate)中实现了 rootviewcotnroller,这样如果用户登录,他将被直接推送到应用程序内容而不是登录 View Controller 。但是它并没有真正起作用。正如已经说过的,我将以下代码添加到应用程序委托(delegate)中:

    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 创建了一个扩展来保存 bool 值,无论用户是登录还是注销:

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)

}

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

应用程序会识别用户是否登录,但用户是否登录并不重要,显示的第一个 View Controller 显示黑屏,这很可能是登录 View Controller ,但如果用户登录后,如果是第一个要呈现的 View Controller ,则 userviewcontroller 也会显示黑屏。 ...

有人知道这是为什么吗?

最佳答案

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

我删除了所有带有 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。我希望将来能帮助别人!

关于ios - Viewcontroller 在实现 rootviewcontroller 后只显示黑屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43172520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com