NSApplication keyWindow равен нулю во время приложенияDidFinishLaunching

Начиная с пустого проекта приложения OS X, я добавляю следующий код в файл applicationDidFinishLaunching.

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

При запуске я столкнулся с ошибкой, потому что моя локальная переменная window равна нулю. Тем не менее, когда я показываю содержимое переменной приложения, я вижу действительное значение для _keyWindow. Также обратите внимание, что на экране рядом с дампом стека отображается пустое окно графического интерфейса.

введите описание изображения здесь

Почему в этом случае свойство keyWindow: NSWindow? возвращает nil? Спасибо


person Price Ringo    schedule 06.09.2015    source источник


Ответы (1)


Свойство keyWindow NSApplication будет иметь значение nil всякий раз, когда приложение неактивно, поскольку ни одно окно не фокусируется на событиях клавиатуры. Вы не можете полагаться на то, что он будет активен после завершения запуска, потому что пользователь мог активировать какое-то другое приложение между запуском вашего приложения и завершением его запуска, а Cocoa спроектирован так, чтобы не украсть фокус.

В какой-то степени вы можете видеть, что это происходит чаще при запуске из Xcode, потому что активация приложения в этом случае немного странная. Но, тем не менее, вы не должны писать свой applicationDidFinishLaunching() метод, предполагающий, что ваше приложение активно.

То, что вы видите с точки зрения переменной экземпляра приложения _keyWindow, конечно же, является деталью реализации. Нельзя быть уверенным в том, что это означает, и вам определенно не следует полагаться на это. Тем не менее, я считаю, что это в основном «скрытое» ключевое окно приложения. Это окно снова станет ключевым при активации приложения (если только оно не будет активировано нажатием на другое окно).

person Ken Thomases    schedule 06.09.2015
comment
Я запустил тестовое приложение прямо из Finder без сбоев. Я подтвердил в журнале консоли, что проблем не было, так что это действительно артефакт запуска из XCode. - person Price Ringo; 06.09.2015