У меня есть приложение Firebase, написанное программно с root контроллером представления, встроенным в UINavigationController.
SceneDelegate.swift
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(windowScene: windowScene)
window?.makeKeyAndVisible()
window?.rootViewController = UINavigationController(rootViewController: HomeController())
В приложении Первое, что происходит в HomeController
, - это проверка, вошел ли пользователь в систему, если нет, он представляет отдельный ViewController с именем LoginController
, который также встроен в UINavigationController, чтобы перемещаться между регистром и Login View Controller.
HomeController.swift (это то, что выполняется, если Firebase сообщает, что пользователь не вошел в систему)
let nav = UINavigationController(rootViewController: LoginController())
nav.isModalInPresentation = true
nav.modalPresentationStyle = .fullScreen
self.present(nav, animated: true, completion: nil)
Однако метод в LoginController
, который выполняет вход пользователя и настраивает HomeController
, не работает должным образом. Вот как я обычно создаю экземпляр rootViewController, когда он не встроен в UINavigationController:
guard let controller = UIApplication.shared.windows.filter({$0.isKeyWindow}).first?.rootViewController as? HomeController else { return }
Он отображается как nil
, когда он встроен в UINavigationController.
Мой вопрос: как создать экземпляр HomeController
для вызова его функций для настройки пользовательского интерфейса и т. д. c. после отклонения LoginController
?
Просто напишите let homeController = HomeController()
, затем вызов homeController.configureUI()
не работает.
EDIT:
I смог получить доступ к методу из HomeController
следующим образом:
let controller = self.navigationController?.viewControllers[0] as? HomeController
controller?.configure()
Но я не думаю, что это хорошее решение.