簡體   English   中英

在實現rootviewcontroller之后,Viewcontroller只會顯示黑屏

[英]Viewcontroller just shows black screen after implementing a rootviewcontroller

我對編程非常陌生,這就是為什么我不能真正弄清楚如何解決此問題的原因。 我已經在應用程序委托中實現了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)

}

當用戶按下登錄按鈕時,將調用此函數。

該應用程序可以識別用戶是否登錄,但用戶是否登錄無關緊要,顯示的第一個視圖控制器顯示黑屏,很可能是loginviewcontroller,但如果用戶已登錄如果要顯示的第一個視圖控制器,則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。 希望以后能對其他人有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM