如何限制 macOS 窗口管理恢复特定窗口?

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

我有一个应用程序,它有几个窗口定义为一个窗口组,其结构符合主场景中的应用程序:

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
}

还有其他方法不恢复窗口吗?或者更好的是,能够以编程方式将其恢复为之前的大小等,但仅在用户指示“开始”时启动

蒂亚

macos swiftui swiftui-windowgroup nswindowrestoration
3个回答
5
投票

@Asperi 在后面的评论中建议的代码解决方案:

func applicationDidFinishLaunching(_ notification: Notification) {
    UserDefaults.standard.register(defaults: ["NSQuitAlwaysKeepsWindows" : false])
}

0
投票

根据@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


0
投票

@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
    }
}

缺点

  • 这将影响所有窗口
  • 状态恢复适用于窗口,包括大小和位置。
© www.soinside.com 2019 - 2024. All rights reserved.