我正在 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 中的所有窗口?
“有什么想法可以让用户点击按钮创建的窗口不持久吗?”
当用户创建新窗口时,您可能会检查其他现有窗口并使用 Dismiss() 删除它们。
此外,在启动应用程序时,您可以有一个 userDefault 并为应用程序启动时设置一个标志,并删除现有的窗口