关于 ios-navigation
ios-navigation 是面向 clinic 模块化 MVVM-C 架构的 SwiftUI 导航指南,适合 iOS 开发者规划协调器和路由外壳。它涵盖导航流程、无障碍支持与状态恢复。
主要功能
- 01协调器与路由外壳架构
- 02Push、Sheet 和深度链接模式
- 03多步骤与标签页导航流程
- 04转场和模态呈现指南
- 05导航无障碍实践
- 06状态恢复建议
适用场景
- 01设计 SwiftUI 应用的导航层级
- 02构建引导或其他多步骤流程
- 03添加深度链接和导航持久化
- 04检查导航的模块化与无障碍支持
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ pproenca/ dot-skills --skill ios-navigation安装后在 Claude Code 中输入/ios-navigation确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
metadata.jsonassets/templates/_template.mdreferences/_sections.mdally-focus-after-navigation.mdally-group-navigation-elements.mdally-hide-decorative-navigation.mdally-keyboard-focus.mdally-rotor-headers.mdanim-gesture-driven.mdanim-matched-geometry-same-view.mdanim-reduce-motion-transitions.mdanim-scroll-driven.mdanim-spring-config.mdanim-transition-source-styling.mdanim-zoom-transition.mdanti-hamburger-menu.mdanti-hidden-back-button.mdanti-mixed-link-styles.mdanti-navigation-in-init.mdanti-programmatic-tab-switch.mdanti-scattered-destinations.mdanti-shared-stack.mdarch-coordinator-modals.mdarch-coordinator.mdarch-deep-linking.mdarch-destination-item.mdarch-destination-registration.mdarch-equatable-views.mdarch-navigation-path.mdarch-navigation-stack.md详细介绍
iOS 导航(Modular MVVM-C)
为采用 clinic 模块化架构的 SwiftUI 应用提供明确的导航规范。重点关注协调器与路由外壳的接线、功能隔离,以及可靠的 push/sheet/深层链接流程。
不可妥协的约束(iOS 26 / Swift 6.2)
- 每个导航视图都使用
@Equatable宏,绝不使用AnyView - 全面使用
@Observable,绝不使用ObservableObject/@Published - App 目标中的协调器拥有
NavigationPath;路由外壳负责.navigationDestination映射 - 模态状态由协调器拥有,绝不使用内联
@State布尔值控制 sheet - Domain 层定义协调器协议;具体协调器不得放在功能模块中
Clinic 架构约定(iOS 26 / Swift 6.2)
本技能中的所有指导均基于 clinic 模块化 MVVM-C 架构:
- 功能模块仅导入
Domain+DesignSystem(绝不导入Data,也不导入同级功能模块) - App 目标是汇合点,拥有
DependencyContainer、具体协调器和路由外壳接线 Domain保持纯 Swift,并定义模型以及 repository、*Coordinating、ErrorRouting和AppError契约Data负责 SwiftData/网络/同步/重试/后台 I/O,并实现 Domain 协议- 读写流程默认采用 stale-while-revalidate 读取和乐观排队写入
- ViewModel 直接调用 repository 协议(默认不设用例/interactor 层)
适用场景
在以下场景中参考这些指南:
- 使用 NavigationStack 或 NavigationSplitView 设计导航层级
- 选择 push、sheet 或 fullScreenCover
- 实现 hero 动画、缩放转场或手势驱动的关闭操作
- 构建多步骤流程(引导、结账、注册)
- 使用 @Observable、@Environment 和 @Bindable 共享导航状态
- 审查代码中的导航反模式和模块化架构合规性
- 添加深层链接、状态恢复或标签页持久化
- 确保导航支持 VoiceOver 和减弱动态效果
按优先级划分的规则类别
| 优先级 | 类别 | 影响 | 前缀 |
|---|---|---|---|
| 1 | 导航架构 | CRITICAL | arch- |
| 2 | 导航反模式 | CRITICAL | anti- |
| 3 | 转场与动画 | HIGH | anim- |
| 4 | 模态呈现 | HIGH | modal- |
| 5 | 流程编排 | HIGH | flow- |
| 6 | 导航性能 | MEDIUM-HIGH | perf- |
| 7 | 导航无障碍性 | MEDIUM | ally- |
| 8 | 状态与恢复 | MEDIUM | state- |
快速参考
1. 导航架构(关键)
arch-navigation-stack- 使用 NavigationStack 替代已弃用的 NavigationViewarch-value-based-links- 使用基于值的 NavigationLink,替代目标闭包arch-destination-registration- 在堆栈根部注册 navigationDestinationarch-destination-item- 使用 navigationDestination(item:) 进行基于可选值的导航(iOS 26 / Swift 6.2)arch-route-enum- 将路由定义为 Hashable 枚举arch-split-view- 使用 NavigationSplitView 实现多栏布局arch-coordinator- 将导航逻辑提取到 Observable 协调器中arch-observable-environment- 对共享状态使用 @Observable 和 @Bindable 搭配 @Environmentarch-deep-linking- 通过向 NavigationPath 追加内容来处理深层链接arch-navigation-path- 对异构、类型擦除的导航使用 NavigationPatharch-equatable-views- 为每个导航视图应用 @Equatable 宏arch-observable-only- 仅使用 @Observable——绝不使用 ObservableObject 或 @Publishedarch-no-anyview- 导航中绝不使用 AnyView——改用 @ViewBuilder 或泛型arch-coordinator-modals- 所有模态页面都通过协调器呈现——绝不内联使用 @State
2. 导航反模式(关键)
anti-mixed-link-styles- 避免混用 NavigationLink(destination:) 和 NavigationLink(value:)anti-scattered-destinations- 避免在多个视图中分散声明 navigationDestinationanti-shared-stack- 避免在多个标签页之间共享 NavigationStackanti-hidden-back-button- 避免隐藏返回按钮却不保留滑动手势anti-navigation-in-init- 避免在视图初始化器中执行繁重工作anti-hamburger-menu- 避免使用汉堡菜单导航anti-programmatic-tab-switch- 避免以编程方式更改选中的标签页
3. 转场与动画(高优先级)
anim-zoom-transition- 使用缩放导航转场实现主视觉动画(iOS 18+)anim-matched-geometry-same-view- 仅在同一视图层级中使用 matchedGeometryEffectanim-spring-config- 使用现代弹簧动画语法(iOS 26 / Swift 6.2)anim-gesture-driven- 对手势驱动的转场使用交互式弹簧动画anim-transition-source-styling- 为转场源设置形状和背景样式anim-reduce-motion-transitions- 所有导航动画都应遵循减少动态效果的设置anim-scroll-driven- 使用 onScrollGeometryChange 实现滚动驱动的转场(iOS 18+)
4. 模态呈现(高)
modal-sheet-vs-push- 下钻时使用 push,补充内容使用 sheetmodal-detents- 使用呈现 detents 设置上下文相关的 sheet 尺寸modal-fullscreen-cover- 仅在沉浸式独立体验中使用 fullScreenCovermodal-sheet-placement- 将 .sheet 放在容器视图上,而不是 NavigationLink 上modal-interactive-dismiss- 使用 interactiveDismissDisabled 防止未保存的更改被关闭modal-nested-navigation- 在模态视图中使用独立的 NavigationStack
5. 流程编排(高)
flow-tab-independence- 为每个标签页创建独立的 NavigationStackflow-multi-step- 使用带有路由数组的 NavigationStack 实现多步骤流程flow-sidebar-navigation- 使用带有 selection 绑定的 NavigationSplitView 实现侧边栏导航flow-tab-sidebar-adaptive- 使用 sidebarAdaptable TabView 将 iPad 上的标签页转换为侧边栏(iOS 18+)flow-pop-to-root- 通过清空 NavigationPath 实现返回根视图flow-screen-independence- 使屏幕独立于父级导航上下文
6. 导航性能(中高)
perf-lazy-destinations- 使用基于值的 NavigationLink 延迟构造目标视图perf-task-modifier- 使用 .task 在导航时异步加载数据perf-state-object-ownership- 使用 @State 持有 @Observable 状态,并将其作为普通属性传递perf-avoid-body-side-effects- 避免在视图 body 中产生副作用
7. 导航无障碍功能(中)
ally-rotor-headers- 将导航分区标题标记为 VoiceOver 转子标题ally-focus-after-navigation- 管理程序化导航事件后的焦点ally-group-navigation-elements- 将相关导航元素分组,以减少滑动次数ally-hide-decorative-navigation- 在 VoiceOver 中隐藏装饰性导航元素ally-keyboard-focus- 在表单中使用 @FocusState 实现键盘导航
8. 状态与恢复(中)
state-codable-routes- 将路由枚举设为 Codable,以持久化导航状态state-scene-storage- 使用 SceneStorage 持久化各场景的导航状态state-tab-persistence- 使用 SceneStorage 持久化选中的标签页state-deep-link-urls- 将深层链接 URL 解析为路由枚举state-avoid-app-level-path- 避免在 App 级别定义 NavigationPath
使用方法
阅读各个参考文件,了解详细说明和代码示例:
参考文件
| 文件 | 描述 |
|---|---|
| references/_sections.md | 类别定义和排序 |
| assets/templates/_template.md | 新规则模板 |
| metadata.json | 版本和参考信息 |
评论
支持 Markdown