NSHostingController 是 macOS(AppKit)中用于承载 SwiftUI 视图的桥接控制器。它的主要作用是:
把 SwiftUI 的 View 嵌入到 AppKit 的 NSViewController 体系中。
类定义
class NSHostingController<Content> : NSViewController where Content : View
它继承自 NSViewController,并且泛型 Content 必须是 SwiftUI 的 View 类型。
构造方法
init(rootView: Content)
Content 是任意 SwiftUI View;
它会自动将 SwiftUI 的视图渲染为一个 NSViewController 可用的界面。
使用场景
例如,需要在 NSPopover 中使用 SwiftUI 视图:
struct PopoverContentView: View {
var body: some View {
VStack(spacing: 10) {
Text("你好,这是浮窗")
}
}
}
let popover = NSPopover()
popover.contentViewController = NSHostingController(rootView: MySwiftUIView())
popover.contentViewController 要求是 NSViewController;
MySwiftUIView() 是 SwiftUI 的 View;
所以必须用 NSHostingController 包装它;
这样就能在 Popover、窗口、Sidebar 等 AppKit 组件中显示 SwiftUI 内容。
关于NSViewController在NSPopover用法,具体请见《macOS浮动窗口NSPopover》的“使用示例”部分。
常见用途
1、弹出框中的内容:popover.contentViewController = NSHostingController(…)。
2、创建窗口的根视图控制器:window.contentViewController = NSHostingController(…)。
3、自定义 NSView 容器内部使用 SwiftUI:将 SwiftUI 嵌入任意 NSView 子视图中。
4、SwiftUI <-> AppKit 混合开发:作为桥梁连接 SwiftUI 和 NSViewController。
UIHostingController 的关系?
1、UIHostingController:用于在iOS / iPadOS / tvOS,使用SwiftUI 嵌入 UIKit。
2、NSHostingController:用于在macOS,使用SwiftUI 嵌入 AppKit。
它们原理相同,只是平台不同。
总结
NSHostingController 是 SwiftUI 视图与 AppKit 系统桥接的关键类。凡是 AppKit 需要 NSViewController 的地方,想用 SwiftUI,就必须使用它。
相关文章
macOS浮动窗口NSPopover:https://fangjunyu.com/2025/06/29/macos%e6%b5%ae%e5%8a%a8%e7%aa%97%e5%8f%a3nspopover/