Шаблон координатора с UINavigationControllers и UITabBarController - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь научиться интегрировать шаблон координатора в разработку для iOS.

У меня есть приложение, которое нравится этому.В раскадровке это выглядит так.Контроллеры навигации и панели вкладок не добавляются в раскадровку, поскольку согласно шаблону координатора они будут добавлены программно.

enter image description here

Первый контроллер представления - PhoneViewController, который принимает номер телефона пользователя.Этот контроллер представления встроен в контроллер навигации.После ввода номера телефона он перемещается на VerifyPhoneViewController.После проверки он перемещается в MainViewController tabbarcontroller, который содержит три вкладки.Каждый из этих контроллеров представления будет иметь свой собственный контроллер навигации.

У меня есть протокол, который содержит все необходимые свойства и функции, которые должен реализовать каждый координатор.

protocol Coordinator {
    var childCoordinators: [Coordinator] { get set }
    var navigationController: UINavigationController { get set }

    func start()
}

Я создалотдельный координатор AuthCoordinator для части потока аутентификации приложения.

class AuthCoordinator: Coordinator {
    var childCoordinators = [Coordinator]()

    var navigationController: UINavigationController

    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
    }

    // The initial view
    func start() {
        let phoneViewController = PhoneViewController.instantiate()
        phoneViewController.coordinator = self
        navigationController.pushViewController(phoneViewController, animated: false)
    }

    func submit(phoneNo: String) {
        let verifyPhoneViewController = VerifyPhoneViewController.instantiate()
        verifyPhoneViewController.coordinator = self
        verifyPhoneViewController.phoneNo = phoneNo
        navigationController.pushViewController(verifyPhoneViewController, animated: true)
    }

    // Move to the tabbarcontroller
    func main() {
        let mainViewController = MainViewController.instantiate()
        navigationController.pushViewController(mainViewController, animated: true)
    }
}

Навигация работает нормально.Однако есть небольшая проблема.

Обратите внимание, что после перехода на контроллер табуляции заголовки не отображаются на панели навигации при переключении между контроллерами представления (я устанавливаю их в методе viewDidLoad каждого контроллера представления).Плюс кнопка возврата к VerifyPhoneViewController все еще там.

enter image description here

Проблема очевидна.Навигационный контроллер, который я инициализировал для AuthCoordinator, все еще там наверху.Я буквально помещаю MainViewController в этот стек.

func main() {
    let mainViewController = MainViewController.instantiate()
    navigationController.pushViewController(mainViewController, animated: true)
}

Что я не могу понять, так это способ не сделать это так.Я могу скрыть панель навигации в методе start, но тогда он не идеален, потому что хорошо, он скрывает панель навигации, и я этого не хочу.

func start() {
    let phoneViewController = PhoneViewController.instantiate()
    phoneViewController.coordinator = self
    navigationController.navigationBar.isHidden = true
    navigationController.pushViewController(phoneViewController, animated: false)
}

Есть ли другой способ сохранить контроллер навигации дляпродолжительность потока авторизации, а затем сбросьте его, когда / вскоре после показа MainViewController?

. Демонстрационный проект загружен здесь .

...