Как получить ссылку 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!
Обратите внимание, что это работает, только если вы не поддерживаете несколько окон.