Viewcontroller просто показывает черный экран после реализации rootviewcontroller

Я довольно новичок в программировании, поэтому я не могу понять, как решить эту проблему. Я реализовал rootviewcotnroller в делегате приложения, чтобы, если пользователь вошел в систему, он был перемещен непосредственно в содержимое приложения, а не в контроллер представления входа. Однако на самом деле это не работает. Как уже было сказано, я добавил в делегат приложения следующий код:

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

Контроллер MainView настроен следующим образом:

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 также отображается черный экран, если представлен первый контроллер представления. ...

Кто-нибудь знает, почему это так?


person AlexVilla147    schedule 02.04.2017    source источник
comment
stackoverflow.com/questions/39776929/ Я не понимаю, как создается экземпляр вашего MainViewController. И, просматривая ваш код, кажется, что MainViewController даже не является UIViewController?   -  person    schedule 02.04.2017
comment
Контроллер mainview устанавливается как новый контроллер rootview в делегате приложения. Поэтому всякий раз, когда приложение запускается, сначала вызывается mainviewcontroller. С зарегистрированной функцией он должен переключиться либо на loginviewcontroller, либо на userviewcontroller. Mainviewcontroller — это навигационный контроллер, который является подклассом uiviewcontroller?!   -  person AlexVilla147    schedule 02.04.2017
comment
@AlexVilla, вы создаете свои собственные окна без использования раскадровки?   -  person Tushar Sharma    schedule 02.04.2017
comment
@ Тушар Шарма, извини, я не совсем понимаю твой вопрос. Честно говоря, большая часть кода, который используется для реализации этого rootviewcontroller, взята из учебника на YouTube, в котором все работает отлично. Но для меня все шаги имеют смысл. Поскольку это не работает, я прошу stackoverflow.   -  person AlexVilla147    schedule 02.04.2017
comment
@ AlexVilla147 Я хочу сказать, вы делаете все по коду или также используете раскадровку?   -  person Tushar Sharma    schedule 02.04.2017
comment
Я использую раскадровку большую часть времени. Просто добавляется кнопка facebook без раскадровки. И это единственное, что отображается в файле loginvoewcontroller.   -  person AlexVilla147    schedule 02.04.2017


Ответы (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 по-прежнему установлен как rootviewcontroller в AppDelegate. Я надеюсь, что я помогу кому-то еще в будущем!

person AlexVilla147    schedule 03.04.2017