如何关闭WindowGroup中的所有窗口?

问题描述 投票:0回答:1

我正在 MacOS 的 SwiftUI 中进行编码,我正在寻找一种关闭所有打开的窗口的方法。

我的应用程序具有 Apple 所说的数据驱动窗口组:当用户单击屏幕上的对象以获取更多信息时,会出现一个特定于他们单击的对象的新详细信息窗口。

我遇到的问题是这些窗口默认情况下是持久的。当用户退出并再次运行应用程序时,之前打开的所有详细信息屏幕都会再次出现,即使它们描述的项目不再存在。我不希望重启后出现任何这些窗口。

这是(简化的)代码。我的

App.swift
看起来像这样:

@main
struct MyApp: App {
    @State var vm = ViewModel()

    var body: some Scene {
        WindowGroup { // main window
            ContentView()
                .environment(vm)
        }
        WindowGroup(for: Item.ID.self) { $itemID in
            ItemDetails(itemID: itemID)
                .environment(vm)
        }
    }
}

还有我的

ContentView.swift

struct ContentView: View {
    @Environment(ViewModel.self) private var vm
    @Environment(\.openWindow) private var openWindow

    var body: some View {
        ForEach(vm.items) { item in
            Button(item.name) {
                openWindow(value: item.id)
            }
        }
    }
}

当然,用户可以手动关闭窗口,但是如果他们在会话中创建 15 个新的

ItemDetails
窗口然后退出。我不希望他们必须通过关闭上一个会话中的所有“剩余”窗口来开始下一个会话。

或者,我可以让应用程序在退出时关闭所有窗口。但我想要一个即使应用程序意外退出也能正常工作的解决方案。例如,当 Xcode 停止它并用新版本替换它时。 :)

有什么想法可以让用户点击按钮创建的窗口持续存在吗?或者,如果失败,至少以编程方式关闭 WindowGroup 中的所有窗口?

macos swiftui window persistence
1个回答
1
投票

“有什么想法可以让用户点击按钮创建的窗口不持久吗?”

当用户创建新窗口时,您可能会检查其他现有窗口并使用 Dismiss() 删除它们。

此外,在启动应用程序时,您可以有一个 userDefault 并为应用程序启动时设置一个标志,并删除现有的窗口

© www.soinside.com 2019 - 2024. All rights reserved.