Как вы переключаете контроллер вида root UINavigationController при выходе пользователя из системы (Swift 5) - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь сделать так, чтобы мой начальный root контроллер представления был HomeViewController. Затем я запускаю код, чтобы проверить, вошел ли пользователь (я использую Firebase) уже в систему. Если пользователь не вошел в систему, тогда контроллер вида root изменится на LoginViewController и представит модально экраны входа в систему / регистрации, а затем освободит эти VC после того, как пользователь вошел в систему.

func authenticateUserConfigureView() {

    if Auth.auth().currentUser == nil {
        DispatchQueue.main.async {
            let navController = UINavigationController(rootViewController: LoginViewController)
            navController.navigationBar.barStyle = .default
            self.present(navController, animated: true, completion: nil)
        }
    } else{
        configureViewComponents()
    }

}

похоже, что если я напишу код rootViewController: LoginViewController эта ошибка появляется

Невозможно преобразовать значение типа 'LoginViewController.Type' в ожидаемый тип аргумента 'UIViewController'

В качестве альтернативы, если я напишу LoginViewController(), то, хотя кажется, что пользователя перенаправляют на контроллер вида входа в систему, симулятор сразу же падает.

ОБНОВЛЕНИЕ

Я пытался используя

let homeViewController = self.storyboard?.instantiateViewController(identifier: Constants.Storyboard.homeViewController) as? HomeViewController
        view.window?.rootViewController = homeViewController
        view.window?.makeKeyAndVisible() 

, но, похоже, ничего не происходит (хотя кажется, что он работает). Кстати, я использую основную раскадровку для создания своих контроллеров представления.

1 Ответ

1 голос
/ 02 февраля 2020

Это просто решить, вам нужно передать ViewController экземпляр , который вы можете получить из вашей учетной записи StoryBoard, таким образом:

    let loginViewController = UIStoryboard (name: "LoginStoryboardName", bundle: Bundle.main).instantiateInitialViewController()
    let navController = UINavigationController(rootViewController: loginViewController )
    UIApplication.shared.keyWindow?.rootViewController = navController 

Для работы, в раскадровка входа в систему , ваш viewController должен быть установлен на InitialViewController .

Если ваш раскадровка уже имеет NavigationController, вы можете просто передать экземпляр ViewController экземпляр в rootViewController, вот так:

    let viewController = UIStoryboard (name: "LoginStoryboardName", bundle: Bundle.main).instantiateInitialViewController()
    UIApplication.shared.keyWindow?.rootViewController = viewController

Надеюсь, это поможет.

...