2010-07-29 3 views
23

Je veux convertir un CGPoint de mes coordonnées UIView en UIWindow et j'ai réalisé que UIApplication keyWindow est toujours nul; Pourquoi est-ce?UIApplication sharedApplication - keyWindow est nul?

J'ai essayé la méthode convertPoint:toView: de UIView.

S'il vous plaît voir cet exemple de code que j'ai essayé dans le contrôleur de vue dans un modèle de Xcode (Voir l'application):

- (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"); 
} 

et je reçois:

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

Je peux le convertir mais seulement quand J'accède à la fenêtre via le délégué de l'application. Et pas UIApplication. Selon la documentation, keyWindow devrait fonctionner ici, mais est nul. Pourquoi est-ce?

Répondre

30

Ce code a été exécuté avant le [window makeKeyAndVisible]; qui se trouve dans le délégué de l'application. Donc, pas étonnant pourquoi keyWindow était nil encore.

30

plus simple est d'obtenir la fenêtre du délégué de l'application à la place:

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

Cela fonctionnera-t-il encore si votre application a plusieurs fenêtres? Comme, qu'en est-il dans une application basée sur un document? –

+2

Vous voulez dire [UIApplication sharedApplication] .keyWindow – Laszlo

+0

@Laszlo Ce n'est pas la même chose. On obtient sa fenêtre du délégué de l'application, une de n'importe quelle fenêtre pourrait être sur le dessus en ce moment. – iwasrobbed

11

je remarquai que, après avoir commencé l'accès guidée, la propriété keyWindow sur [UIApplication sharedApplication] semble être nul. Il m'est arrivé uniquement sur iOS7 lorsque vous avez démarré le mode d'accès guidé pour le premier après l'avoir activé dans Paramètres> Général> Accès guidé, de sorte que la vue GAM de départ est réellement affichée et non contournée.

Depuis cette API Apple semble bogué, j'ai résolu en utilisant le code suivant pour récupérer la fenêtre que je recherche.

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

Au lieu de

[[UIApplication sharedApplication] keyWindow]; 

essayer vous pourriez peut-être en utilisant

[[[UIApplication sharedApplication] delegate] window]; 

comme iWasRobbed a souligné, mais il ne fonctionnait pas pour moi comme la propriété rootViewController n'est pas accessible cette façon.

Questions connexes