NSApplication keyWindow 在 applicationDidFinishLaunching 期间为 nil

NSApplication keyWindow is nil during applicationDidFinishLaunching

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

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

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

为什么在这种情况下 keyWindow: NSWindow? 属性 return 为零? 谢谢

NSApplicationkeyWindow 属性 将在应用未处于活动状态时为 nil,因为没有 window 专注于键盘事件。你不能指望它在完成启动时处于活动状态,因为用户可能在他们启动你的应用程序和完成启动之间激活了一些其他应用程序,并且 Cocoa 旨在不窃取焦点。

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

您在应用的 _keyWindow 实例变量方面看到的内容当然是实现细节。人们无法确定它的含义,您绝对不应该依赖它。但是,我相信它基本上是应用程序的 "latent" 键 window。当应用程序被激活时,window 将再次成为密钥(除非它是通过单击另一个 windows 来激活的)。