mcpField
G
guide-swiftui-ui-patterns

guide-swiftui-ui-patterns

github.com/prisma-labs-dev设计与 UI349393 次安装5 周前更新
代码仓库

关于 guide-swiftui-ui-patterns

用于在现有或新项目中实现 SwiftUI 界面和应用结构的指南技能,结合状态管理与导航模式、组件参考,以及构建验证流程。

主要功能

  1. 01现有项目界面工作流
  2. 02新应用脚手架指南
  3. 03SwiftUI 状态归属模式
  4. 04导航与弹层参考
  5. 05异步界面与预览指南
  6. 06构建与验证清单

适用场景

  1. 01为 SwiftUI 项目添加界面
  2. 02搭建标签页与导航结构
  3. 03选择状态和依赖归属方式
  4. 04检查异步界面与弹层模式

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/prisma-labs-dev/apple-skills --skill guide-swiftui-ui-patterns

安装后在 Claude Code 中输入/guide-swiftui-ui-patterns确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
accessibility.md
app-wiring.md
async-state.md
components-index.md
controls.md
deeplinks.md
focus.md
form.md
grids.md
haptics.md
image-optimization.md
input-toolbar.md
latest-apis.md
layout-best-practices.md
lightweight-clients.md
list.md
loading-placeholders.md
macos-settings.md
matched-transitions.md
media.md
menu-bar.md
navigationstack.md
overlay.md
performance.md
previews.md
scroll-patterns.md
scroll-reveal.md
scrollview.md
searchable.md
sheet-navigation-patterns.md

详细介绍

Guide Skill — 这是专家工作流/模式指南,并非 API 参考文档。 最初由 Thomas Ricouard 发布于 Dimillian/Skills。MIT License。

SwiftUI UI 模式

快速开始

根据目标选择路径:

现有项目
  • 确定要实现的功能或界面,以及主要交互模型(列表、详情、编辑器、设置、标签页)。
  • 使用 rg "TabView\(" 或类似命令,在仓库中查找相近示例,然后阅读最接近的 SwiftUI 视图。
  • 遵循本地约定:优先使用 SwiftUI 原生状态,尽可能将状态保留在本地,并通过环境注入共享依赖项。
  • 从 references/components-index.md 中选择相关组件参考,并遵循其中的指导。
  • 如果交互会通过拖动或滚动主内容来显示次要内容,请在手动实现手势前阅读 references/scroll-reveal.md。
  • 使用小巧、专注的子视图构建视图,并采用 SwiftUI 原生的数据流。
新项目脚手架
  • 从 references/app-wiring.md 开始,配置 TabView + NavigationStack + sheets。
  • 根据提供的骨架添加最精简的 AppTab 和 RouterPath。
  • 根据你首先需要的 UI 选择下一份组件参考(TabView、NavigationStack、Sheets)。
  • 添加新界面时,扩展路由和 sheet 枚举。

应遵循的通用规则

  • 使用现代 SwiftUI 状态(@State、@Binding、@Observable、@Environment),避免不必要的视图模型。
  • 如果部署目标包含 iOS 16 或更早版本,且无法使用 iOS 17 引入的 Observation API,则改用 ObservableObject:根视图负责持有时使用 @StateObject,注入观察对象时使用 @ObservedObject,仅在确实属于应用级共享状态时使用 @EnvironmentObject。
  • 优先使用组合;保持视图小巧、专注。
  • 使用 async/await、.task 以及明确的加载/错误状态。有关重启、取消和防抖的指导,请阅读 references/async-state.md。
  • 使用 @Environment 存放共享应用服务,但功能本地的依赖项和模型优先通过显式初始化器注入。根层配置模式请阅读 references/app-wiring.md。
  • 优先使用适用于部署目标的最新 SwiftUI API,并注明模式所依赖的最低 OS 版本。
  • 仅在编辑旧版文件时,才沿用已有的旧版模式。
  • 遵循项目的格式化工具和风格指南。
  • Sheets:当状态表示选定的模型时,优先使用 .sheet(item:) 而非 .sheet(isPresented:)。避免在 sheet 主体内使用 if let。Sheet 应自行管理操作,并在内部调用 dismiss(),而不是转发 onCancel/onConfirm 闭包。
  • 由滚动驱动的显示效果:优先根据滚动偏移推导一个归一化进度值,并用这一个唯一事实来源驱动视觉状态。除非仅靠滚动无法表达该交互,否则避免并行的手势状态机。

状态所有权摘要

使用与所有权模型匹配的最小范围状态工具:

场景首选模式
由单个视图拥有的本地 UI 状态@State
子视图修改由父视图拥有的值状态@Binding
iOS 17+ 上由根视图拥有的引用模型使用 @Observable 类型的 @State
iOS 17+ 上子视图读取或修改注入的 @Observable 模型将其作为存储属性显式传入
共享应用服务或配置@Environment(Type.self)
iOS 16 及更早版本上的旧版引用模型根视图使用 @StateObject,注入时使用 @ObservedObject

先选择所有权位置,再选择包装器。普通值状态足以满足需求时,不要引入引用模型。

跨领域参考资料

  • references/navigationstack.md:导航所有权、每个标签页的历史记录,以及基于枚举的路由。
  • references/sheets.md:集中式模态呈现,以及由枚举驱动的工作表。
  • references/deeplinks.md:URL 处理,以及将外部链接路由到应用目的地。
  • references/app-wiring.md:根依赖图、环境的使用,以及应用外壳的连接方式。
  • references/async-state.md:.task、.task(id:)、取消、防抖,以及异步 UI 状态。
  • references/previews.md:#Preview、固定数据、模拟环境,以及隔离的预览设置。
  • references/performance.md:稳定标识、观察范围、惰性容器,以及渲染成本防护措施。

反模式

  • 在一个文件中混合布局、业务逻辑、网络请求、路由和格式化的大型视图。
  • 使用多个布尔标志来控制互斥的工作表、警报或导航目的地。
  • 在由 body 驱动的代码路径中直接调用实时服务,而不是使用视图生命周期钩子或注入的模型/服务。
  • 为解决本应通过更好的组合来解决的类型不匹配问题而使用 AnyView。
  • 在没有明确所有权理由的情况下,默认将每个共享依赖都设为 @EnvironmentObject,或使用全局路由器。

新建 SwiftUI 视图的工作流

  1. 编写 UI 代码前,先确定视图的状态、所有权位置和最低 OS 要求。
  2. 确定哪些依赖应放在 @Environment 中,哪些应作为显式初始化器输入保留。
  3. 勾勒视图层级、路由模型和呈现位置;将重复部分提取为子视图。对于复杂导航,请阅读 references/navigationstack.md、references/sheets.md 或 references/deeplinks.md。继续之前,先构建并确认没有编译器错误。
  4. 使用 .task 或 .task(id:) 实现异步加载,并在需要时明确处理加载和错误状态。如果工作依赖不断变化的输入或取消,请阅读 references/async-state.md。
  5. 为主要和次要状态添加预览,然后在 UI 可交互时添加辅助功能标签或标识符。如果视图需要固定数据或注入的模拟依赖,请阅读 references/previews.md。
  6. 通过构建进行验证:确认没有编译器错误,检查预览能否正常渲染且不会崩溃,确保状态变化能正确传递,并检查列表标识和观察范围是否会导致可避免的重复渲染。如果屏幕较大、滚动内容较多或更新频繁,请阅读 references/performance.md。对于常见的 SwiftUI 编译错误——缺少 @State 注解、ViewBuilder 闭包不明确,或泛型类型不匹配——应先解决,再更新调用点。**如果构建失败:**仔细阅读错误消息,修复指出的问题,然后重新构建,再继续下一步。如果预览崩溃,请隔离出问题的子视图,确认其状态初始化有效,然后重新运行预览,再继续操作。

组件参考资料

请将 references/components-index.md 作为入口。每份组件参考资料都应包括:

  • 意图和最适用的场景。
  • 遵循本地约定的最简用法模式。
  • 常见陷阱和性能说明。
  • 当前仓库中现有示例的路径。

添加新的组件参考资料

  • 创建 references/<component>.md。
  • 内容应简短且便于执行;链接到当前仓库中的具体文件。
  • 在 references/components-index.md 中添加新条目。

评论

支持 Markdown