需求场景

在macos 中常常需要在一个窗口中打开另一窗口,比如”设置页面“、”关于页面“。在 AppKit 中 可以使用 NSWorkspace.share.open() 方法打开,在 SwiftUI 中 有更简单的方法。

效果

MacOS app 多窗口 【SwiftUI】

实现

在app 入口文件中,添加多个窗口视图,除主窗口外,每个窗口要添加一个id 选项用于打开识别。

WindowGroup(id: "MySetting") {
    MySetting()
}
WindowGroup(id:"MyAbout") {
	AboutView()
}

在调用的页面注入环境 的openWindow 方法,在回调中执行该方法


struct ContentView: View {
    @Environment(.openWindow) private var openWindow
    var body: some View {
        VStack {
            Button {
                openWindow(id: "MySetting")
                openWindow(id: "MyAbout")
            } label: {
              Text("open two window")
            }
        }
    }
}

后记

在网上搜索SwiftUI 怎么打开另一个窗口,搜到的是使用 NSWorkspace.share.open 方法,使用这个方法,url 一直有问题,再看看 WindowGroup 的文档,文档中有打开多窗口的方法,现在 MacOS App 开发太少了, 网上搜索到的答案都是使用老旧的 Appkit 中的方法,下次有问题,首先要看文档。