如何检测 AppKit 应用程序是否已使用文档启动?

问题描述

我正在构建一个基于 NSDocument 的应用程序,我希望能够检测我的应用程序的启动是因为用户打开文档还是因为用户只是点击了停靠栏图标。我尝试检查 Notification 方法附带的 applicationDidFinishLaunching,但它似乎不包含对文档的引用。我也尝试从该方法查询 NSDocumentController.shared.documents,但此时数组仍为空。我注意到在调用 applicationDidBecomeActive 时,文档已经被实例化,但是当然,这个方法也会在与应用启动无关的场合被调用,所以这并不理想。我目前最好的猜测是执行以下操作,但感觉就像一个黑客。

class AppDelegate: NSObject,NSApplicationDelegate {
    private var hasBecomeActiveOnce = false

    func applicationDidBecomeActive(_ notification: Notification) {
        if !hasBecomeActiveOnce {
            hasBecomeActiveOnce = true
            if !NSDocumentController.shared.documents.isEmpty {
                print("App launched from document!")
            }
        }
    }
}

一定有更好(更惯用)的方式。我错过了什么?

解决方法

好的,我想我已经找到了我的具体问题的答案,上面的问题可能没有完全传达。基本上,我想要做的是在应用程序启动时显示一个打开的面板,或者当单击停靠栏图标并且没有打开文档时。在这两种情况下,系统似乎都调用 applicationOpenUntitledFile。回答我自己的问题,以防其他人遇到同样的问题。

class AppDelegate: NSObject,NSApplicationDelegate {
    func applicationOpenUntitledFile(_ sender: NSApplication) -> Bool {
        print("app launched (or dock clicked) without a document!")
        return true
    }
}