Как получить ссылку keyWindow в быстром приложении?

В Objective-C в методе viewDidLoad для UIViewController я делаю это, чтобы получить ссылку keyWindow в моем приложении iOS:

 UIWindow * keyWindow = [[UIApplication sharedApplication] keyWindow];

Итак, я переношу этот контроллер представления в Swift, и я делаю этот вызов viewDidLoad:

let window = UIApplication.sharedApplication().keyWindow

Я пытаюсь понять, почему окно равно нулю. Когда я ставлю точку останова сразу после этой строки, я проверяю окно в консоли, и я получаю следующее:

(lldb) po window
nil

Как я могу получить окно для правильной ссылки на keyWindow моего приложения в swift?

Ответы

Ответ 1

Я подошел к этому вопросу, когда искал быстрый поиск окна. Если вы хотите получить окно вместо keyWindow, попробуйте следующее:

if let app = UIApplication.sharedApplication().delegate as? AppDelegate, let window = app.window {
    MBProgressHUD.show(text, view:window)
}

Обновлен для Swift 3: (Спасибо @Trevor)

if let app = UIApplication.shared.delegate as? AppDelegate, let window = app.window {
    MBProgressHUD.show(text, view:window)
}

Ответ 2

Swift 4 просто обладает свойством UIApplication.shared.keyWindow, не требуется кастинг.

Обратите внимание, что iOS 13/iPadOS представляет UIScenes и явную поддержку нескольких окон, и, таким образом, не поддерживает концепцию keyWindow, поскольку она больше не действительна.

Этот вопрос содержит обзор того, как получить доступ к окнам на основе сцены.

Ответ 3

Обновление ответа superarts.org для Swift 3:

if let app = UIApplication.shared.delegate as? AppDelegate, let window = app.window { 
      MBProgressHUD.show(text, view: window)
}

Ответ 4

Ключевое окно еще не должно быть установлено во время просмотраDidLoad. Ваш код отлично работает в viewDidAppear. Кроме того, вы можете получить массив windows в viewDidLoad и получить один (если есть более одного) из окон из этого массива.

Ответ 5

Не вызывайте окно в функции doLoad вызовите функцию keyWindow в viewDidAppear функции ViewController

Ответ 6

Самый простой способ сделать это:

в Objective-C

[UIApplication sharedApplication].windows.firstObject

в Свифте

UIApplication.shared.windows.first!

Обратите внимание, что это работает, только если вы не поддерживаете несколько окон.