iphone objective-c uiapplicationdelegate uiapplication

iphone - UIApplication sharedApplication-keyWindow is nil?



appdelegate swift (3)

Quiero convertir un CGPoint de mis coordenadas UIView a UIWindow y me he dado cuenta de que la clave de aplicación UIAWindow siempre es nula; ¿Por qué es esto?

He probado el convertPoint:toView: desde UIView.

Consulte este código de muestra que probé en el controlador de vista en una plantilla de Xcode (Ver aplicación):

- (void)viewDidLoad { [super viewDidLoad]; UIView *test = [[UIView alloc] initWithFrame:CGRectMake(40,40,250,250)]; [test setBackgroundColor:[UIColor redColor]]; [self.view addSubview:test]; CGPoint p = CGPointMake(100, 100); CGPoint np; np = [test convertPoint:p toView:[[UIApplication sharedApplication] keyWindow]]; NSLog(@"p:%@ np:%@", NSStringFromCGPoint(p), NSStringFromCGPoint(np)); AppDelegate *appDel = (AppDelegate *)[UIApplication sharedApplication].delegate; np = [test convertPoint:p toView:[appDel window]]; NSLog(@"p:%@ np:%@", NSStringFromCGPoint(p), NSStringFromCGPoint(np)); np = [test convertPoint:p toView:nil]; NSLog(@"p:%@ np:%@", NSStringFromCGPoint(p), NSStringFromCGPoint(np)); [test release]; if(![[UIApplication sharedApplication] keyWindow]) NSLog(@"window was nil"); }

y me sale:

p:{100, 100} np:{100, 100} p:{100, 100} np:{140, 160} p:{100, 100} np:{100, 100} window was nil

Puedo convertirlo pero solo cuando accedo a la ventana a través del delegado de la aplicación. Y no UIApplication. Según la documentación, keyWindow debería funcionar aquí, pero es nulo. ¿Por qué es esto?


Este código fue ejecutado antes de [window makeKeyAndVisible]; que está dentro del delegado de la aplicación. Entonces, no es de extrañar por qué keyWindow era nil todavía.


La forma más sencilla es obtener la ventana del delegado de la aplicación en su lugar:

UIWindow *keyWindow = [[[UIApplication sharedApplication] delegate] window]; // Do something with the window now


Noté que después de haber iniciado el acceso guiado, la propiedad keyWindow en [UIApplication sharedApplication] parece ser nula.

Me sucedió solo en iOS7 al iniciar el Modo de acceso guiado por primera vez después de haberlo habilitado en Configuración> General> Acceso guiado, por lo que la vista de inicio de GAM se muestra y no se pasa por alto.

Ya que esta API de Apple parece estar llena de errores, resolví usar el siguiente código para recuperar la ventana que estoy buscando.

NSArray *windows = [[UIApplication sharedApplication] windows]; if ([windows count]) { return windows[0]; } return nil;

En lugar de

[[UIApplication sharedApplication] keyWindow];

tal vez también podrías intentar usar

[[[UIApplication sharedApplication] delegate] window];

como señaló , pero no me rootViewController ya que la propiedad rootViewController no es accesible de esta manera.