Координатор навигации в SwiftUI - PullRequest
0 голосов
/ 24 марта 2020

Исторически, используя UIKit, мы всегда использовали Шаблон координат для обработки навигации.

Запуск нового приложения в SwiftUI, однако неясно, как с этим справиться.

Например, наш текущий поток будет:

  1. Запуски приложений
  2. Запускается координатор приложения
  3. Загружает «Начальную сцену»
  4. Начальная сцена проверяет состояние аутентификации и вызывает делегата на Координаторе приложений
  5. Координатор приложений запускается 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 в координаторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...