我有一个应用程序,它有几个窗口定义为一个窗口组,其结构符合主场景中的应用程序:
WindowGroup("StandingsView") {
StandingsView()
.environmentObject(appServices)
}
.handlesExternalEvents(matching: Set(arrayLiteral: "StandingsView"))
appServices 需要一些时间来配置,所以我不想在启动时自动恢复窗口。我在用户选择有效、服务完全配置并且用户按下“开始”SwiftUI 按钮时创建窗口:
if let standingsURL = URL(string: "raceStratLiteApp://StandingsView") {
NSWorkspace.shared.open(standingsURL)
}
我尝试在 appDelegate 的 applicationShouldTerminate() 中关闭窗口。 我还尝试在 applicationShouldTerminate 中将 isRestorable 设置为 false:
func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply {
for window in NSApplication.shared.windows {
window.isRestorable = false
}
return .terminateNow
}
还有其他方法不恢复窗口吗?或者更好的是,能够以编程方式将其恢复为之前的大小等,但仅在用户指示“开始”时启动
蒂亚
@Asperi 在后面的评论中建议的代码解决方案:
func applicationDidFinishLaunching(_ notification: Notification) {
UserDefaults.standard.register(defaults: ["NSQuitAlwaysKeepsWindows" : false])
}
根据@Asperi提供的提示,将以下内容写入默认值将停止窗口状态的写入:
$ defaults write <bundleid> NSQuitAlwaysKeepsWindows -bool false
所以这不是对应用程序的代码更改,而是在安装时完成的环境配置。
我还删除了位于
~/Library/Saved Application State/<bundleid>.savedState
的存档构建目录和位于 ~/Library/Containers/<App Name>/Data/Library/Saved Application State/<bundleid>.savedState
的调试构建目录。我不确定这是否重要,但一旦执行这些步骤,问题就解决了。谢谢@Asperi
@Asperi 给出的答案对于大多数情况都是有用的。 但是当应用程序被中断时,例如崩溃时,
NSQuitAlwaysKeepsWindows
似乎被忽略了。
对我有用的是选择退出状态恢复中的每个
NSWindow
。
缺点是这会影响每个窗口。但没有其他解决方案适用于我的情况。
为此我必须使用 NotificationCenter,监听 NSWindow。 didBecomeKeyNotification,找不到更好的替代方案。
在您的NSApplicationDelegateAdaptor
func applicationWillFinishLaunching(_: Notification) {
NotificationCenter
.default
.addObserver(forName: NSWindow.didBecomeKeyNotification,
object: nil,
queue: .main)
{ notification in
guard let window = notification.object as? NSWindow else { return }
window.isRestorable = false
}
}