Ответ 1
UIApplicationDelegate
обычно имеет ссылку на "главное окно":
[[[UIApplication sharedApplication] delegate] window];
Кроме того, UIApplication
имеет массив окон [[UIApplication sharedApplication] windows]
.
UIApplication имеет метод keyWindow
, однако, если отображается представление предупреждения, это возвращает окно представления предупреждения, а не главное окно приложения.
Как получить главное окно приложения?
UIApplicationDelegate
обычно имеет ссылку на "главное окно":
[[[UIApplication sharedApplication] delegate] window];
Кроме того, UIApplication
имеет массив окон [[UIApplication sharedApplication] windows]
.
Я не уверен на 100%, что это работает в каждом случае, но это должно работать:
UIWindow *mainWindow = [UIApplication sharedApplication].windows[0];
Окна упорядочиваются назад, поэтому главное окно всегда должно быть в индексе 0.
UIApplication *application = [UIApplication sharedInstance];
NSarray *appWindows = [NSArray arrayWithArray:application.windows];
UIWindow *mainWindow = [appWindows objectAtIndex:0];
Я не уверен, но это может помочь.
В Swift:
UIApplication.sharedApplication().delegate?.window
Swift 3.0 версия rmaddy answer:
let window = UIApplication.shared.windows.first
Я также должен добавить, что, поскольку iOS 8.0 UIAlertController
заменил UIAlertView
и, будучи контроллером вида, вы больше не сталкиваетесь с проблемой создания новых окон.
Для меня я представлял popViewController
self.presentViewController(popViewController, animated: true, completion: nil)
а затем в viewDidLoad()
этого popViewController я добавлял subview, это вызывает ошибку в консоли и ошибку отображения. Поэтому я должен найти другое решение, чтобы заставить его работать. Надеюсь, это поможет.
Swift 3
if let window = NSApplication.shared().windows.first {
// you can now modify window attributes
}
Swift 3
class func sharedInstance() -> AppDelegate{
return UIApplication.shared.delegate as! AppDelegate
}