首页 > 解决方案 > 带有 UINavigationControllers 和 UITabBarController 的协调器模式

问题描述

我正在尝试学习如何将协调器模式集成到 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

演示项目在此处上传。

标签: iosswiftuinavigationcontrolleruitabbarcontrollercoordinator-pattern

解决方案


推荐阅读