ios iphone objective-c

ios - difrence entre[[[UIAplicación compartida de la aplicación] delegado] ventana] y[[UIApplication sharedApplication].keyWindow?



iphone objective-c (4)

La configuración más simple es solo tener una UIWindow . Por lo general, esa ventana se guarda como una propiedad en el delegado de su aplicación. keyWindow es el que está designado para recibir el teclado y otros eventos no relacionados con el tacto. Solo una ventana a la vez puede ser la ventana clave. Entonces, si agrega una segunda ventana y la convierte en la keyWindow (a través de [window makeKeyAndVisible] ), ¡sus líneas devuelven ventanas diferentes!

Hola soy novato en el desarrollo de iPhone ¿alguien me puede ayudar a saber la diferencia entre las siguientes dos líneas:

Primero:

[[[[UIApplication sharedApplication] delegate] window] addSubview:UIView];

Segundo:

[[UIApplication sharedApplication].keyWindow addSubview:UIView];

Gracias por adelantado.


La respuesta de Basheer_CAD no es correcta. No son siempre los mismos en iOS.

La respuesta de Jeffery Thomas es correcta y déjame dar un ejemplo concreto.

- (void)viewDidLoad { [super viewDidLoad]; NSLog(@"keyWindow --------> %@",[UIApplication sharedApplication].keyWindow.rootViewController); NSLog(@"delegate.window --> %@",[UIApplication sharedApplication].delegate.window.rootViewController); NSLog(@"self.view.window -> %@",self.view.window.rootViewController); } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"title" message:@"message" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:nil]; [alert show]; NSLog(@"keyWindow --------> %@",[UIApplication sharedApplication].keyWindow.rootViewController); NSLog(@"delegate.window --> %@",[UIApplication sharedApplication].delegate.window.rootViewController); NSLog(@"self.view.window -> %@",self.view.window.rootViewController); }

El resultado es:

keyWindow --------> (null) delegate.window --> <ViewController: 0x10030c0e0> self.view.window -> (null) keyWindow --------> <UIApplicationRotationFollowingController: 0x100204510> delegate.window --> <ViewController: 0x10030c0e0> self.view.window -> <ViewController: 0x10030c0e0>

Cuando viewDidLoad , realmente la ventana aún no está lista, entonces no hay nada para la ventana del sistema. UIAlertView puede dominar la ventana, por lo que no puede obtener la ventana que desea.


Para la mayoría de los usos, serán los mismos ... pero no siempre.

[UIApplication sharedApplication].keyWindow es la ventana que se muestra actualmente en el dispositivo. Esta es normalmente la ventana de su aplicación, pero podría ser una ventana del sistema.

[UIApplication sharedApplication].delegate.window es la ventana que se espera que use su aplicación.

¿Cuál debería ser usado? Bueno, todo depende del contexto.

Si está actualizando parte de su aplicación, debe agregar vistas a la ventana de su aplicación. Esto es casi siempre lo que quieres hacer.

Personalmente, siempre uso [[UIApplication sharedApplication].delegate.window addSubview:view] o [self.view.window addSubView:view] (dentro de UIViewController ) cuando necesito agregar una vista directamente a la ventana.

Es posible que algunas veces desee presentar una vista de la ventana que se muestra actualmente, independientemente de si la ventana pertenece a su aplicación o si es alguna ventana del sistema. No me he encontrado con esa situación.


Podrían ser lo mismo en iOS. Cuando son diferentes, generalmente está presentando otra ventana que no sea la ventana principal del delegado de la aplicación. Su aplicación puede tener muchas ventanas, pero solo la ventana keyWindow es la ventana que está visible en la pantalla y que recibe los eventos (por ejemplo, podría ser un UIAlert cuando sea visible y recibir eventos es la ventana clave) referencia: https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html

de la documentación:
- Para la [[[UIApplication sharedApplication] delegate] window];

La ventana para usar cuando se presenta un guión gráfico. Esta propiedad contiene la ventana utilizada para presentar el contenido visual de la aplicación en la pantalla principal del dispositivo.

es decir, esta es la window propiedad que tiene en su archivo appDelegate.h

  • para [[UIApplication sharedApplication] keyWindow];

Esta propiedad contiene el objeto UIWindow en la matriz de Windows que recientemente envió el mensaje makeKeyAndVisible.

En iOS, enviaste makeKeyAndVisible en tu appDelegate.m dentro
application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

Hiciste que la ventana de applelegate creada fuera la ventana clave. Por lo general, las aplicaciones bancarias cambian la ventana clave cuando la aplicación se pone en segundo plano para proteger la información sensible del usuario cuando se duplica el botón de inicio girado y vuelve a la ventana principal de delegado cuando la aplicación está en primer plano.
Esta respuesta es en colaboración con: @SipkeSchoorstra, @D-Mx y @andyDarwin