协调器模式
集中管理导航流程逻辑。
协调器模式 是 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 反馈 — 无需本地设置。