关于 appkit-interop
帮助 SwiftUI 开发者在需要原生 macOS 行为时,以尽可能小的桥接接入 AppKit。它根据功能缺口选择视图、控制器或应用级接口,并明确状态所有权与生命周期边界。
主要功能
- 01按需求选择最小桥接方式
- 02使用 Representable 包装 AppKit 视图
- 03处理窗口、菜单与响应者链
- 04明确 SwiftUI 与 AppKit 的状态边界
- 05检查协调器和生命周期假设
适用场景
- 01在 SwiftUI 中接入特定 AppKit 控件
- 02实现窗口或面板行为
- 03处理菜单验证与第一响应者
- 04添加拖放或文件面板支持
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ openai/ plugins --skill appkit-interop安装后在 Claude Code 中输入/appkit-interop确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
agents/openai.yamlreferences/drag-drop-pasteboard.mdrepresentables.mdresponder-menus.mdwindow-panels.md详细介绍
AppKit 互操作
快速开始
当 SwiftUI 已经很接近,但仍无法满足原生 macOS 行为需求时,使用此技能。 尽可能让桥接保持精简且明确。通常应由 SwiftUI 继续作为事实来源,而由 AppKit 处理命令式边缘场景。
选择最小的桥接方案
- 如果场景、工具栏、命令、检查器或标准控件已支持所需行为,请使用纯 SwiftUI。
- 如果需要特定的 AppKit 视图,且生命周期需求较简单,请使用
NSViewRepresentable。 - 如果需要控制器生命周期、委托或展示协调,请使用
NSViewControllerRepresentable。 - 如果需要
NSWindow、响应者链、菜单验证、面板或应用级行为,请直接使用 AppKit 窗口或应用钩子。
工作流
-
准确指出能力缺口。
- 窗口行为
- 文本系统行为
- 菜单验证
- 拖放
- 文件打开/保存面板
- 第一响应者控制
-
选择能够解决问题的最小边界。
- 如果只需包装一个控件或使用协调器,就不要把整个屏幕移植到 AppKit。
-
明确所有权。
- SwiftUI 拥有值状态、选择状态和可观察模型。
- AppKit 对象应保留在可表示对象、协调器或桥接对象内部。
-
向 SwiftUI 暴露精简接口。
- 用于可编辑状态的绑定
- 用于事件的简短回调
- 仅在必要时提供专用桥接服务
-
验证生命周期假设。
- SwiftUI 可能会重新创建可表示对象。
- 协调器用于承载委托和目标-动作衔接代码,而不是充当第二套应用架构。
参考资料
references/representables.md:如何在视图和视图控制器包装器之间做选择,以及协调器模式。references/window-panels.md:窗口访问、实用窗口和打开/保存面板。references/responder-menus.md:第一响应者、命令路由和菜单验证。references/drag-drop-pasteboard.md:粘贴板、文件 URL 和桌面拖放边缘场景。
护栏
- 不要在 SwiftUI 和 AppKit 之间重复维护事实来源。
- 不要让
Coordinator变成杂乱无章的代码堆放处。 - 除非有充分的所有权理由,否则不要在全局存储长期存在的
NSView或NSWindow实例。 - 优先采用经过测试的小型桥接方案,而不是用原生 AppKit 重写整个功能。
- 如果某种模式可以完全由
swiftui-patterns实现,就将其保留在那里。
输出要求
请提供:
- 正在跨越的 SwiftUI 具体限制
- 建议采用的最小桥接类型
- SwiftUI 与 AppKit 之间的数据流边界
- 需要留意的生命周期或验证风险
评论
支持 Markdown