Шаблон iOS Swift Coordinator и кнопка «Назад» навигационного контроллера - PullRequest
0 голосов
/ 12 января 2019

Я использую шаблон MVVM+Coordinator. Каждые мои контроллеры созданы coordinators. Но как правильно остановить мои координаторы при нажатии на кнопку возврата на Navigation Controller?

class InStoreMainCoordinator: NavigationCoordinatorType, HasDisposeBag {

    let container: Container

    enum InStoreMainChildCoordinator: String {
        case menu = "Menu"
        case locations = "Locations"
    }

    var navigationController: UINavigationController
    var childCoordinators = [String: CoordinatorType]()

    init(navigationController: UINavigationController, container: Container) {
        self.navigationController = navigationController
        self.container = container
    }

    func start() {
        let inStoreMainViewModel = InStoreMainViewModel()
        let inStoreMainController = InStoreMainController()
        inStoreMainController.viewModel = inStoreMainViewModel

        navigationController.pushViewController(inStoreMainController, animated: true)
    }
}

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

У шаблона координатора есть известное слепое пятно относительно родной кнопки возврата. В основном у вас есть два способа исправить это:

  • Переопределите свою собственную кнопку "назад", хотя вы теряете собственный жест смахивание назад для навигации назад.
  • Реализовать UINavigationControllerDelegate, чтобы определить, когда всплыло представление, чтобы иметь возможность освободить соответствующего координатора.

Что касается первого решения, я не предлагаю это, пользователь заплатит цену за вашу архитектуру кода, это не звучит справедливо.

Что касается второго, вы можете реализовать его для самого Координатора, как предложено @mosbah, но я бы посоветовал вам пойти дальше и отделить Навигацию от Координатора, используя класс NavigationController или Router, чтобы изолировать Сама навигация и сохраняйте четкое разделение проблем.

Я написал кое-что об этом здесь , в котором подробно описаны основные шаги.

0 голосов
/ 12 января 2019

Мой подход заключается в использовании корневого (родительского) координатора, который управляет дочерними координаторами, поэтому, когда пользователь заканчивает поток или нажимает кнопку «назад», вызывается метод делегата в корневом координаторе, который может очистить дочерний координатор и создать новый. один при необходимости.

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