AppKit 和 SwiftUI 互相引用
SwiftUI 已经迭代了好几个版本,但是目前很多的功能只用 SwiftUI 还是无法实现,需要使用 AppKit 中的功能实现,SwiftUI 的macOS view不够的时候,要用之前的 AppKit 中的 组件,需要把 AppKit 的view或 Controller 镶嵌到 SwiftUI 视图中,SwiftUI 的窗口管理功能不够,要用NSWindow,这时需要把 SwiftUI 中的View 用到 AppKit 中,总的来说分2种:1.SwiftUI view 中使用 AppKit 的 NSView 或 NSController 2. Appkit 的 视图或控制器中使用 是SwiftUI 的View
1. 在SwiftUI 中使用 AppKit中NSView 或NSController
NSViewRepresentable
NSViewRepresentable 用于将 NSView 嵌入到 SwiftUI 中,用于简单的 AppKit 控件嵌入 SwiftUI,比如按钮、文本框、图像视图等。
NSViewRepresentable 协议要求实现两个方法:
其中,Context 类型实际上是 NSViewRepresentableContext,它包含了一些对你有用的信息和功能,例如 SwiftUI 的环境(environment),以及用于协调 SwiftUI 和 AppKit 的 Coordinator。
NSViewRepresentableContext 的组成部分:
NSViewControllerRepresentable
NSViewControllerRepresentable用于将完整的NSViewController嵌入到 SwiftUI 中。这适用于复杂场景,如需要NSViewController管理多个视图、处理控制逻辑或导航。它特别适合需要管理视图层次结构、处理复杂逻辑或生命周期事件的情况。此协议管理NSViewController及其视图,包括生命周期方法(如viewDidLoad、viewWillAppear等)。
其中makeNSViewController 和 updateNSViewController 中的 Context 是 NSViewControllerRepresentableContext ,他有2个部分组成:
2 在appkit 中使用 SwiftUI view
在 AppKit 中使用 SwiftUI View 对应 view 和controller有两个分别是NSHostingView 和 NSHostingController ,另外还有一个 NSHostingMenu 来处理菜单
NSHostingController
NSHostingController是一个工具,用于在 macOS 的 AppKit 应用中使用 SwiftUI 视图。它把 SwiftUI 视图放入一个NSViewController中,这样你就可以在现有的 AppKit 界面里使用 SwiftUI 设计的界面了。
使用NSHostingController的主要好处是:
如果你正在开发一个 AppKit 应用,想要慢慢转向使用 SwiftUI,或者只想在某些地方使用 SwiftUI,NSHostingController就是一个很好的选择。它让你能够保持现有项目的结构,同时利用 SwiftUI 的优势来构建新的界面。
其他应用场景- 将 SwiftUI 视图嵌入 NSWindow
你可以直接将 SwiftUI 视图嵌入到 NSWindow 中,而不需要创建整个 NSViewController。
这个例子展示了如何将 SwiftUI 视图直接设置为 NSWindow 的内容视图,而不是通过 NSViewController。这对想创建完全基于 SwiftUI 的 macOS 界面非常有用。
NSHostingView
NSHostingView 是 SwiftUI 和 AppKit 之间的桥梁之一,允许你在 macOS 应用中将 SwiftUI 视图嵌入到现有的 AppKit 视图层次结构中。与 NSHostingController 类似,NSHostingView 负责将 SwiftUI 视图渲染为 AppKit 的 NSView,但它直接生成一个 NSView,而不是通过 NSViewController 来管理视图。NSHostingView 适用于那些你想要直接在现有的 NSView 结构中嵌入 SwiftUI 视图的场景。它更简单,不需要控制器管理视图的生命周期,而是将 SwiftUI 的 View 转换成一个 AppKit 的 NSView。
代码示例
NSHostingView vs NSHostingController
AppKit 中使用 SwiftUI View 还有2个枚举类:
NSHostingSizingOptions
NSHostingSizingOptions 是一个枚举类型,用于控制 NSHostingView 或 NSHostingController 在 macOS 上如何根据其 SwiftUI 内容调整大小。它提供了不同的选项,帮助你确定 SwiftUI 视图是按照其内容大小自动调整,还是保持固定尺寸。这在处理自适应布局或弹性界面时非常有用。它有三个选项:
NSHostingSceneBridgingOptions
在 SwiftUI 6 中,NSHostingSceneBridgingOptions 枚举有三个选项,分别为 all、title 和 toolbars,这些选项用来控制 SwiftUI 与 AppKit 场景之间在标题和工具栏方面的桥接行为。通过 NSHostingSceneBridgingOptions,你可以细粒度地控制 SwiftUI 和 AppKit 场景之间的交互,确保混合界面应用中的一致性和流畅体验。下面我会详细解释每个选项的作用及其应用场景。
1. .all
2. .title
3. .toolbars
使用示例