在 applicationDidFinishLaunching 期间 NSApplication keyWindow 为零

Pri*_*ngo 5 cocoa nsapplication swift

从一个空白的 OS X 应用程序项目开始,我将以下代码添加到applicationDidFinishLaunching.

func applicationDidFinishLaunching(aNotification: NSNotification) {
    let app = NSApplication.sharedApplication()
    guard let window = app.keyWindow else {
        fatalError("No keyWindow\n")
    }
    print(window)
}
Run Code Online (Sandbox Code Playgroud)

在启动时我遇到了错误情况,因为我的局部window变量为零。然而,当我显示 app 变量的内容时,我看到_keyWindow. 另请注意,空白的 GUI 窗口显示在堆栈转储旁边的屏幕上。

在此处输入图片说明

为什么keyWindow: NSWindow?在这种情况下属性返回 nil?谢谢

Ken*_*ses 7

NSApplicationkeyWindow属性将nil在应用程序不活动时为,因为键盘事件没有聚焦窗口。您不能依赖它在完成启动时处于活动状态,因为用户可能在启动您的应用程序和完成启动之间激活了其他一些应用程序,而 Cocoa 旨在不窃取焦点。

在某种程度上,您可能会在从 Xcode 启动时看到更多情况发生,因为在这种情况下应用程序激活有点奇怪。但是,您仍然不能编写您的applicationDidFinishLaunching()方法来假设您的应用程序处于活动状态。

您所看到的应用程序_keyWindow实例变量当然是一个实现细节。人们无法确定它的含义,您绝对不应该依赖它。但是,我相信它基本上是应用程序的“潜在”关键窗口。当应用程序被激活时,这个窗口将再次成为关键(除非它是通过点击它的另一个窗口来激活的)。

  • 我直接从 Finder 启动了测试应用程序,没有崩溃。我在控制台日志中确认没有问题,因此确实这是从 XCode 中运行的工件。 (2认同)