MacOS 应用程序无法将 SwiftUI 视图实例化为根视图控制器

MacOS app unable to instantiate SwiftUI view as a root view controller

我正在尝试加载 SwiftUI 视图作为 macOS 应用程序的第一个视图控制器,不幸的是它在 macOS window 中没有显示任何内容。以下是我为 macOS 编写应用程序委托的方式。

class AppDelegate: NSObject, NSApplicationDelegate {

    let contentView = NSHostingController(rootView: ContentView.init())


    func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Insert code here to initialize your application
        let storyBoard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: Bundle.main)
        let window = storyBoard.instantiateController(withIdentifier: "Main Window") as! NSWindowController

        window.contentViewController = contentView
    }
}

内容视图

struct ContentView: View {
    var body: some View {
        Text.init("Hello World!")
    }
}

这是输出

我的目标是为 macOS 设置 rootViewController,这个视图控制器是用 SwiftUI 制作的。非常感谢任何帮助。

我假设您只看到 window 的初始 window 控制器自动从故事板创建,而没有看到您以编程方式创建的 window 因为内容视图大小为零。

因此 a) 确保初始 window 控制器已停用

和 b) 添加内容视图的大小(你需要这个,因为你以编程方式执行所有操作),例如

struct ContentView: View {
    var body: some View {
        VStack {
            Text("Hello World!")
        }
        .frame(width: 800, height: 600)    // << here !!
    }
}

更新: 将创建的 window 控制器存储到本地 属性

class AppDelegate: NSObject, NSApplicationDelegate {

    
    let contentView = NSHostingController(rootView: ContentView())
    private var window: NSWindowController! // << here !!

    ...

        window.contentViewController = contentView
        window.showWindow(nil)

使用 Xcode 13 / macOS 11.6 进行测试(在从头开始创建的测试项目上)