用途:当 SwiftUI 能力接近但不足以实现原生 macOS 行为时使用此技能,以最小、显式的方式桥接 AppKit,让 SwiftUI 通常保持为数据源,AppKit 只处理命令式边界。
主要能力与选择:
- 纯 SwiftUI:所需行为已存在于 scenes、toolbars、commands、inspectors 或标准控件时。
- NSViewRepresentable:需要特定 AppKit 视图且生命周期较轻。
- NSViewControllerRepresentable:需要控制器生命周期、委托或呈现协调。
- 直接 AppKit 窗口或应用钩子:需要 NSWindow、响应链、菜单验证、面板或应用级行为。
工作流:先明确能力缺口(窗口行为、文本系统行为、菜单验证、拖放、文件打开/保存面板、第一响应者控制),选择最小边界;避免把整个屏幕移植到 AppKit。所有权要清晰:SwiftUI 拥有值状态、选择和可观察模型;AppKit 对象留在 representable、coordinator 或桥接对象内;向 SwiftUI 暴露窄接口(可编辑状态的绑定、事件的少量回调、必要时聚焦的桥接服务)。验证生命周期假设:SwiftUI 可能重建 representable,Coordinator 仅用于持有委托和 target-action 胶水,不应成为第二套应用架构。
参考资料:representables.md(视图与视图控制器包装器选择及 coordinator 模式)、window-panels.md(窗口访问、工具窗口、打开/保存面板)、responder-menus.md(第一响应者、命令路由、菜单验证)、drag-drop-pasteboard.md(粘贴板、文件 URL、桌面拖放边界)。
限制与护栏:不要在 SwiftUI 和 AppKit 之间重复数据源;不要让 Coordinator 成为无结构堆放处;没有强所有权理由不要全局存储长期存在的 NSView 或 NSWindow;优先使用小型经过测试的桥接而非用原生 AppKit 重写功能;若模式可完全留在 swiftui-patterns 中,就保留在那里。输出需给出跨越的精确 SwiftUI 限制、推荐的最小桥接类型、SwiftUI 与 AppKit 间的数据流边界以及需要注意的生命周期或验证风险。