Я пытаюсь научиться интегрировать шаблон координатора в разработку для iOS.
У меня есть приложение, которое нравится этому.В раскадровке это выглядит так.Контроллеры навигации и панели вкладок не добавляются в раскадровку, поскольку согласно шаблону координатора они будут добавлены программно.
Первый контроллер представления - 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
все еще там.
Проблема очевидна.Навигационный контроллер, который я инициализировал для 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
?
. Демонстрационный проект загружен здесь .