web-dev-qa-db-fra.com

UIApplication sharedApplication - keyWindow is nil?

Je souhaite convertir un CGPoint de mes coordonnées UIView en coordonnées UIWindow et je me suis rendu compte que UIApplication keyWindow est toujours nul; Pourquoi est-ce?

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

Veuillez voir cet exemple de code que j'ai essayé dans le contrôleur de vue dans un modèle de Xcode (View 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 uniquement lorsque j'accède à la fenêtre par l'intermédiaire du délégué de l'application. Et pas UIApplication. Selon la documentation, keyWindow devrait fonctionner ici, mais est nul. Pourquoi est-ce?

27
nacho4d

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

36
nacho4d

Le moyen le 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
32
iwasrobbed

J'ai remarqué qu'après avoir démarré l'accès guidé, la propriété keyWindow de [UIApplication sharedApplication] semblait être nil.

Cela ne m'est arrivé que sur iOS7 lors du démarrage du mode d'accès guidé pour le first time 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.

Étant donné que cette API Apple semble défectueuse, j'ai résolu le problème en utilisant le code suivant pour récupérer la fenêtre que je cherchais.

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

Au lieu de 

[[UIApplication sharedApplication] keyWindow];

peut-être pourriez-vous aussi essayer d'utiliser 

[[[UIApplication sharedApplication] delegate] window];

comme l'a fait remarquer iWasRobbed mais cela ne fonctionnait pas pour moi car la propriété rootViewController n'est pas accessible de cette façon.

11
albertodebortoli

Essayez ceci, obtenez d’abord le UINavigationController, puis le topViewController

let navController = window?.rootViewController as! UINavigationController
let yourMainViewController = navController.topViewController as! ItemsViewController

ou

let yourMainViewController = navController.viewControllers.first as! ItemsViewController
0
Naishta