macOS桥接SwiftUI和AppKit视图的NSHostingView
macOS桥接SwiftUI和AppKit视图的NSHostingView

macOS桥接SwiftUI和AppKit视图的NSHostingView

NSHostingView 是 Apple 在 macOS 上为桥接 SwiftUI 与 AppKit 提供的一个关键类。

它的作用是:把 SwiftUI 的 View 嵌入到 AppKit(NSView)层级中,在传统 macOS 应用中使用 SwiftUI 的视图。

基本用法

let mySwiftUIView = Text("Hello, SwiftUI!")

let hostingView = NSHostingView(rootView: mySwiftUIView)
hostingView.frame = NSRect(x: 0, y: 0, width: 200, height: 50)

myWindow.contentView?.addSubview(hostingView)

上面这段代码:创建了一个 SwiftUI 的 Text,用 NSHostingView 包裹成 NSView,添加到 macOS 原生窗口中。

使用场景

1、AppKit 中用 SwiftUI。

2、NSViewController 中嵌入 SwiftUI。

3、NSWindow.contentView = SwiftUI View,实际内部是 NSHostingView。

和 NSHostingController 的关系

在学习桥接视图、视图控制器的过程中,SwiftUI桥接到AppKit控制器的还有NSHostingController,它们的关系如下:

1、NSHostingView:SwiftUI桥接为NSView类型。

2、NSHostingController:SwiftUI桥接到NSViewController类型,视图为SwiftUI桥接的NSView视图。

因此,NSHostingController.view实际就是NSHostingView,这是SwiftUI桥接为AppKit的NSView视图。

总结

NSHostingView是NSView的子类,用于SwiftUI View嵌入到AppKit中。

用于NSView层级,如果使用生命周期管理,建议使用NSHostingController:

let hostingView = NSHostingController(rootView:
    image
    .resizable()
    .scaledToFit()
    .frame(minWidth: 400, minHeight: 400)
    .padding()
)

let window = NSWindow(contentViewController: hostingView)

这样就省去了NSWindow初始化创建NSViewController的步骤。

相关文章

1、SwiftUI、AppKit和UIKit之间的桥接控制器:https://fangjunyu.com/2025/06/30/swiftui%e3%80%81appkit%e5%92%8cuikit%e4%b9%8b%e9%97%b4%e7%9a%84%e6%a1%a5%e6%8e%a5%e6%8e%a7%e5%88%b6%e5%99%a8/

2、macOS管理视图的NSViewController:https://fangjunyu.com/2025/07/01/macos%e7%ae%a1%e7%90%86%e8%a7%86%e5%9b%be%e7%9a%84nsviewcontroller/

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注