Шаблон координатора для замены UINavigationController в SplitViewController - PullRequest
1 голос
/ 18 января 2020

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

Когда приложение запускается, координатор работает должным образом, и когда я нажимаю или pu sh на том же navigationController, реализованном при запуске, также работает нормально, моя единственная проблема - когда я пытаюсь заменить все navigationController из splitviewcontroller.

ВЫПУСК: добавление нового navigationController не отображается для пользователя

здесь моя реализация.

class Coordinator: Navigable, DataCommunicator{
    //MARK: - Navigable Conformable
    typealias UIController = SplitController
    var viewController: UIController
    var childCoordinators: [Coordinatable] = []
    //MARK: - Root Custom setup
    weak var parentCoordinator: RootCoordinator?
    //MARK: - Init
    init(viewController: UIController) {
        self.viewController = viewController
    }

    func start() {
      let categoryNavigationController = CategoryNavigationController()
        let categoryNavigationCoordinator = CategoryNavigationCoordinator(viewController: noteNavigationController)
        categoryNavigationCoordinator.start()
        childCoordinators.append(categoryNavigationCoordinator)
        categoryNavigationController.coordinator = self     
        viewController.viewControllers = [categoryNavigationController]
    }
    func startSearchCategory() {
        childCoordinators.removeLast()
        viewController.navigationController?.popToRootViewController(animated: false)
        viewController.viewControllers.removeLast()

        let searchNavigationController = SearchNavigationController()
        let searchCoordinator = SearchNavigationCoordinator(viewController:searchNavigationController)
        searchCoordinator.start()
        childCoordinators.append(searchCoordinator)
        searchNavigationController.coordinator = self
        searchCoordinator.parentCoordinator = self
        viewController.viewControllers = [searchNavigationController]

    }

}

1 Ответ

0 голосов
/ 19 января 2020

Обновление: Я думаю, что достиг желаемого поведения другим подходом, но мне любопытно, почему я не могу отобразить разные navigationController для masterController в UISplitViewController и отобразить их.

Но мой подход помог моему коду стать более модульным. Я добавил в свой протокол Coordinator следующую функцию

    func stopChild<T: Coordinatable>(coordinator: T, callback: CoordinatorCallBack?)

и реализовал эту функцию следующим образом:

  override func stopChild<T>(coordinator: T, callback: CoordinatorCallBack?) where T : Coordinatable {
        childCoordinators = childCoordinators.filter({$0 !== coordinator})
// Calling parent to stop the child coordinator to roll back to the rootController
        parentCoordinator?.stopChild(coordinator: self, callback: nil)

 }

Откат помог мне создать экземпляр полного стека, который я хочу, не пытаясь чтобы добавить пользовательский модифицирующий код для splitViewController, вместо этого я заменяю весь splitViewController на тот, который соответствует модулю, с которым я работаю, что лучше для использования generi c. Поскольку при моем обратном вызове я могу отправить координатору root желаемый модуль, который будет заинтересован в следующем.

...