mcpField
S
swiftui-ui-patterns

swiftui-ui-patterns

github.com/openai开发7.7k117 次安装3 周前更新
代码仓库

关于 swiftui-ui-patterns

用于在现有或新项目中构建 SwiftUI 界面的参考技能,涵盖状态归属、导航、呈现、异步 UI 状态、视图组合及验证实践。

主要功能

  1. 01SwiftUI 状态归属指引
  2. 02导航与工作表模式
  3. 03异步加载及错误状态
  4. 04可复用视图组合
  5. 05构建、预览与性能检查

适用场景

  1. 01为现有 SwiftUI 应用添加页面
  2. 02搭建新应用的导航结构
  3. 03实现异步加载和错误界面
  4. 04审查状态及视图组合

安装

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

$npx skills add https://github.com/openai/plugins --skill swiftui-ui-patterns

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

包含的文件

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

agents/
openai.yaml
references/
app-wiring.md
async-state.md
components-index.md
controls.md
deeplinks.md
focus.md
form.md
grids.md
haptics.md
input-toolbar.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-reveal.md
scrollview.md
searchable.md
sheets.md
split-views.md
tabview.md
theming.md
title-menus.md

详细介绍

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,并注明模式依赖的最低操作系统版本。
  • 仅在编辑旧版文件时,才沿用现有的旧版模式。
  • 遵循项目的格式化工具和样式指南。
  • 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

先确定所有权位置,再选择包装器。如果普通值状态已经足够,就不要引入引用模型。

跨领域参考资料

  • 除以下参考资料外,如果 SwiftUI API、可用性或平台指南可能已有变更,请使用网页搜索查阅最新的 Apple 开发者文档。
  • 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、fixture、模拟环境以及隔离的预览设置。
  • 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 可交互时添加无障碍标签或标识符。如果视图需要 fixture 或注入模拟依赖项,请阅读 references/previews.md。
  6. 通过构建进行验证:确认没有编译器错误,检查预览能否正常渲染且不会崩溃,确保状态变化能够正确传递,并检查列表标识和观察范围不会造成可避免的重复渲染。如果屏幕较大、滚动较多或更新频繁,请阅读 references/performance.md。对于常见的 SwiftUI 编译错误(例如缺少 @State 注释、ViewBuilder 闭包不明确或泛型类型不匹配),请先解决问题,再更新调用点。**如果构建失败:**仔细阅读错误消息,修复指出的问题,然后重新构建,再继续下一步。如果预览崩溃,请隔离导致问题的子视图,确认其状态初始化有效,然后重新运行预览再继续。

组件参考资料

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

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

添加新的组件参考资料

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

评论

支持 Markdown