2010-07-29 13 views
23

Quiero convertir un CGPoint de mi UIView a coordenadas UIWindow y me he dado cuenta de que UIApplication keyWindow es siempre nula; ¿Por qué es esto?UIApplication sharedApplication - keyWindow is nil?

He intentado el método convertPoint:toView: de UIView.

Por favor, vea este código de ejemplo he intentado en el controlador de vista en una plantilla de Xcode (Ver solicitud):

- (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 sólo cuando Accedo a la ventana a través del delegado de la aplicación. Y no UIApplication. De acuerdo con la documentación, keyWindow debería funcionar aquí, pero es nulo. ¿Por qué es esto?

Respuesta

30

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

30

La manera más fácil es conseguir que la ventana del delegado de la aplicación en su lugar:

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

¿Funcionará esto aún si su aplicación tiene varias ventanas? Me gusta, ¿qué tal en una aplicación basada en documentos? –

+2

Te refieres a [UIApplication sharedApplication] .keyWindow – Laszlo

+0

@Laszlo Eso no es lo mismo. Uno obtiene su ventana del delegado de la aplicación, uno de la ventana que esté en la parte superior en este momento. – iwasrobbed

11

me di cuenta de que después de haber comenzado el acceso guiado, la propiedad keyWindow en [UIApplication sharedApplication] parece ser nula.

Me ha ocurrido sólo en iOS7 al iniciar el modo de acceso guiada para el primera vez después de haber activado en Ajustes> General> guiada acceso, por lo que la vista GAM partida se muestra realmente y no sean transmitidos por.

Dado que esta API de Apple parece fallar, he resuelto 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 usted también podría tratar de usar

[[[UIApplication sharedApplication] delegate] window]; 

como iWasRobbed señalado pero no funcionaba para mí ya que la propiedad no es accesible rootViewController este camino.

Cuestiones relacionadas