Skip to content

16.1_创建Coordinator模式来管理导航

为什么选择Coordinator模式?

在iOS应用开发中,导航管理常常变得复杂。传统的UINavigationControllerUIViewController之间的耦合度较高,导致代码难以维护和测试。Coordinator模式应运而生,它将导航逻辑从视图控制器中解耦,极大地提升了代码的清晰度和可维护性。 🚀

Coordinator模式的核心概念

Coordinator模式的核心思想是将导航流程的控制权交给一个独立的“协调者”对象。这个协调者负责创建、呈现和销毁视图控制器,并处理它们之间的跳转逻辑。这样,视图控制器就只专注于UI的展示和用户交互,而无需关心如何跳转到下一个页面。

  • 解耦: 视图控制器不再直接知道下一个视图控制器。
  • 可重用性: 导航流可以作为独立的模块被重用。
  • 可测试性: 导航逻辑可以独立于UI进行测试。

实现基础Coordinator协议

首先,我们需要定义一个Coordinator协议,它将作为所有具体协调者的蓝图。这个协议通常包含一个start()方法,用于启动协调者管理的导航流。

swift
protocol Coordinator: AnyObject {
    var navigationController: UINavigationController { get set }
    var children: [Coordinator] { get set }
    func start()
}

这个协议确保了每个协调者都拥有一个导航控制器来管理视图栈,并且可以管理其子协调者。 🌟

创建主应用Coordinator

接下来,我们将创建一个AppCoordinator,它将是整个应用导航的入口点。AppCoordinator负责设置应用的初始视图控制器,并可以启动其他子协调者来管理不同的功能模块。

swift
class AppCoordinator: Coordinator {
    var navigationController: UINavigationController
    var children: [Coordinator> = []

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

    func start() {
        // 启动第一个功能模块的协调者
        let listCoordinator = ListCoordinator(navigationController: navigationController)
        children.append(listCoordinator)
        listCoordinator.start()
    }
}

SceneDelegate中,你可以这样初始化并启动AppCoordinator

swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let windowScene = (scene as? UIWindowScene) else { return }
    window = UIWindow(windowScene: windowScene)
    let navigationController = UINavigationController()
    appCoordinator = AppCoordinator(navigationController: navigationController)
    appCoordinator?.start()
    window?.rootViewController = navigationController
    window?.makeKeyAndVisible()
}

模块化导航流

想象一下,你的应用有一个列表页面和一个详情页面。你可以为列表功能创建一个ListCoordinator,它负责列表页面的导航。当用户从列表页点击进入详情页时,ListCoordinator可以启动一个DetailCoordinator来处理详情页的导航。这种模块化的方法让你的导航逻辑清晰且易于管理。 🤩

  • ListCoordinator: 管理列表页面的展示和跳转。
  • DetailCoordinator: 管理详情页面的展示和跳转。

通过这种方式,每个协调者都专注于其特定的导航职责,从而实现了高度的解耦。例如,ListCoordinator可能包含一个方法来处理用户选择列表项后的跳转,它会负责创建DetailViewController并将其推送到导航栈。

本站使用 VitePress 制作