我正在尝试学习如何将协调器模式集成到iOS开发中。
我有一个像这样的应用程序。在情节提要中,它看起来像这样。不会在情节提要中添加导航控制器和标签栏,因为根据协调员模式,它们将以编程方式添加。
第一个视图控制器是PhoneViewController
,它将获取用户的电话号码。该视图控制器嵌入在导航控制器中。输入电话号码后,它将移至VerifyPhoneViewController
。验证后,它将移至MainViewController
一个包含三个选项卡的选项卡控制器。这些视图控制器中的每一个将拥有自己的单独的导航控制器。
我有一个协议,其中包含每个协调器需要实现的所有必要属性和功能。
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)
}
}
导航正常。但是有一个小问题。
请注意,移至tabbarcontroller后,在视图控制器之间切换时,标题不会显示在导航栏中(我确实在每个视图控制器的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
之后/很快将其丢弃?
演示项目已上载here。