Исторически, используя UIKit
, мы всегда использовали Шаблон координат для обработки навигации.
Запуск нового приложения в SwiftUI
, однако неясно, как с этим справиться.
Например, наш текущий поток будет:
- Запуски приложений
- Запускается координатор приложения
- Загружает «Начальную сцену»
- Начальная сцена проверяет состояние аутентификации и вызывает делегата на Координаторе приложений
- Координатор приложений запускается
showHomeScene
или showAuthScene
Что-то вроде
final class AppCoordinator: BaseCoordinator {
private(set) var navigationController: UINavigationController?
init(navigationController: UINavigationController?) {
self.navigationController = navigationController
}
override func start() {
showStartScene()
}
private func showStartScene() {
let configurator = StartConfigurator()
let viewController = configurator.create(self)
navigationController?.setViewControllers([viewController], animated: false)
}
private func showHomeScene() {
let coordinator = HomeCoordinator(self, navigationController: navigationController)
store(coordinator: coordinator)
coordinator.start()
}
private func showAuthScene() {
let coordinator = AuthCoordinator(self, navigationController: navigationController)
store(coordinator: coordinator)
coordinator.start()
}
}
extension AppCoordinator: StartSceneDelegate {
func userNeedsToAuthenticate() {
showAuthScene()
}
func userIsAuthenticated() {
showHomeScene()
}
}
Однако как мы не используем UIViewController
, как navigationController?.setViewControllers([viewController], animated: false)
работает?
Должны ли мы просто установить, используя UIHostingController
?
Что-то вроде - navigationController?.setViewControllers([UIHostingController(rootView: StartView())], animated: false)
Это кажется немного странным, поскольку я не верю, что представления SwiftUI действительно будут использовать UINavigationController
, так как они используют NavigationView
и NavigationLink
.
Разве UINavigationController
действительно просто служит оболочкой?
Я рассматривал возможность использования @EnvironmentObject
в координаторе и на основе состояния авторизации заменил контроллер представления root в координаторе.