0Pricing
Swift Academy · 课时

协调器模式

集中管理导航流程逻辑。

协调器模式 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

导航问题

当视图直接推送和呈现其他视图时,导航逻辑会分散在整个应用中。每个屏幕都必须了解下一个屏幕,从而形成紧密耦合。

协调器模式通过将导航提取到专用对象中解决了这个问题。

什么是协调器

协调器唯一的职责是管理导航流程。它决定下一个显示哪个屏幕,并创建要显示的控制器或视图。

视图不再处理路由——它们只发出事件信号,由协调器决定如何处理。

协调器协议

大多数实现都会从一个小型协议开始,所有协调器都遵循该协议。

protocol Coordinator: AnyObject {
    var childCoordinators: [Coordinator] { get set }
    func start()
}

具体协调器

具体的协调器持有一个导航控制器,并在 start() 中构建第一个屏幕。

final class AppCoordinator: Coordinator {
    var childCoordinators: [Coordinator] = []
    let navigationController: UINavigationController

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

    func start() {
        let vc = HomeViewController()
        navigationController.setViewControllers([vc], animated: false)
    }
}

将视图与路由解耦

关键优势在于:视图不再构造下一个屏幕,而是告诉协调器某个事件已经发生,由协调器负责路由。

这意味着无需修改屏幕代码,就能在不同流程中复用同一个屏幕。

向上发送事件信号

视图通过 delegate 或闭包与协调器通信。视图不需要知道接下来会跳转到哪里。

protocol HomeViewControllerDelegate: AnyObject {
    func homeDidSelectProfile()
}

final class HomeViewController: UIViewController {
    weak var delegate: HomeViewControllerDelegate?

    func profileTapped() {
        delegate?.homeDidSelectProfile()
    }
}

处理路由

协调器遵循 delegate,并在事件触发时决定如何导航。

extension AppCoordinator: HomeViewControllerDelegate {
    func homeDidSelectProfile() {
        let profile = ProfileViewController()
        navigationController.pushViewController(profile, animated: true)
    }
}

子协调器

大型流程(如引导流程和结账流程)会拥有自己的子协调器。父协调器启动子协调器,并将其保存在 childCoordinators 中,使其保持存活。

func startOnboarding() {
    let child = OnboardingCoordinator(navigationController: navigationController)
    childCoordinators.append(child)
    child.start()
}

避免内存泄漏

由于父协调器会持有子协调器,因此必须在流程结束时移除子协调器,否则就会造成泄漏。一种常见做法是使用完成回调。

func childDidFinish(_ child: Coordinator) {
    childCoordinators.removeAll { $0 === child }
}

在 SwiftUI 中使用协调器

在 SwiftUI 中,协调器通常驱动 NavigationStack 的路径。协调器持有一个可观察的路径,视图则将路由 append 到该路径中。

final class Router: ObservableObject {
    @Published var path: [Route] = []

    func push(_ route: Route) {
        path.append(route)
    }
}

enum Route: Hashable { case profile, settings }

优势回顾

协调器模式带来了以下优势:

  • 可复用的视图,不会将导航逻辑硬编码其中
  • 集中管理的流程逻辑,易于修改
  • 可测试的路由,与用户界面分离
  • 通过子协调器实现可组合的流程

快速检查

测试您对协调器的理解。

回顾

您学习了协调器模式:

  • 协调器负责导航,使视图无需了解路由
  • 视图通过 delegate 或闭包向上发送事件信号
  • 子协调器用于表示自包含的流程
  • 流程结束时移除子协调器,以避免泄漏

协调器与 MVVM 结合后,就构成了清晰且可测试的架构。

常见问题解答

「协调器模式」课时是免费的吗?

是的 — 「协调器模式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「协调器模式」这节课中我会学到什么?

集中管理导航流程逻辑。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「协调器模式」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. MVVM 模式
  2. 将视图模型绑定到视图
  3. 协调器模式
  4. 测试视图模型
← 返回 Swift Academy