Obtener la window principal de la aplicación

UIApplication tiene un método keyWindow , sin embargo, si se muestra una vista de alerta, esto devuelve la window de la vista de alerta y no la window principal de la aplicación.

¿Cómo puedo get la window principal de la aplicación?

El UIApplicationDelegate generalmente tiene una reference a la "window principal":

 [[[UIApplication shanetworkingApplication] delegate] window]; 

Además, UIApplication tiene una matriz de windows [[UIApplication shanetworkingApplication] windows] .

Consulte la reference de class de aplicación UIA .

No estoy 100% seguro de que esto funcione en todos los casos, pero esto debería funcionar:

 UIWindow *mainWindow = [UIApplication shanetworkingApplication].windows[0]; 

Las windows se orderan de vuelta al frente, por lo que la window principal siempre debe estar en el índice 0.

 UIApplication *application = [UIApplication shanetworkingInstance]; NSarray *appWindows = [NSArray arrayWithArray:application.windows]; UIWindow *mainWindow = [appWindows objectAtIndex:0]; 

No estoy seguro, pero esto podría ayudar.

En Swift:

 UIApplication.shanetworkingApplication().delegate?.window 

Para mí estaba presentando un popViewController

 self.presentViewController(popViewController, animated: true, completion: nil) 

y luego en viewDidLoad() de este popViewController estaba agregando una subvista , esto provoca el error en la console y un error de pantalla. Entonces, tengo que search otra solución para que funcione. Espero que esto ayude.

Versión Swift 3.0 de la respuesta de rmaddy :

 let window = UIApplication.shanetworking.windows.first 

También debo agregar que, dado que iOS 8.0 UIAlertController ha reemplazado UIAlertView y que es un controller de vista, es posible que ya no se enfrente al problema de la creación de nuevas windows.

Swift 3

  if let window = NSApplication.shanetworking().windows.first { // you can now modify window attributes } 

Swift 3

 class func shanetworkingInstance() -> AppDelegate{ return UIApplication.shanetworking.delegate as! AppDelegate }