web-dev-qa-db-fra.com

fenêtre nulle inattendue dans _UIApplicationHandleEventFromQueueEvent

Une de mes anciennes applications ne fonctionne pas avec iOS8. Lorsque je démarre l'application et que j'essaie de taper sur l'écran n'importe où, je reçois ce message dans ma console:

unexpected nil window in _UIApplicationHandleEventFromQueueEvent, 
_windowServerHitTestWindow: <UIWindow: 0x7fe4d3e52660; frame = (0 0; 320 568); 
opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7fe4d3e2c450>; 
layer = <UIWindowLayer: 0x7fe4d3e86a10>>

J'utilise un ancien style MainWindow.xib. Dans le MainWindow.xib se trouve mon objet Window, ainsi qu'un UINavigationController qui a également défini son premier View Controller. L'image ci-dessous montre les prises connectées au délégué d'application.

La "vue" blanche dans la capture d'écran ci-dessous est la fenêtre UIWindow. La vue de droite est le UINavigationController (barre de navigation cachée) avec le premier ViewController défini à l'intérieur.

enter image description here

Comment résoudre ce problème sans recréer l'intégralité de l'application à partir de zéro avec un nouveau projet?

EDIT: Je viens de découvrir qu'il y a une bande minuscule dans laquelle mes boutons recevront réellement leurs taps/clics.

J'ai également remarqué que mon self.view.window est nul. Comment puis-je m'assurer que ce paramètre est défini?

enter image description here

35
Kenny Wyland

Complément à la réponse B H. Regardez aussi cette réponse .

J'ai rencontré ce problème lors du lancement de mon application paysage uniquement à partir de l'orientation portrait (l'application ne devrait pas non plus être présentée dans la liste des applications récemment ouvertes, ce qui peut être vu en appuyant deux fois sur le bouton Accueil. Peut-être qu'iOS met en cache l'orientation et la taille de la fenêtre).

Mon code était

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window makeKeyAndVisible];

J'ai mis W+H masque de redimensionnement automatique pour la fenêtre, cela ne m'a pas aidé, car la fenêtre n'est pas redimensionnée lors de la rotation, mais la matrice transform est modifiée.

La solution est simple

self.window = [UIWindow new];
[self.window makeKeyAndVisible];
self.window.frame = [[UIScreen mainScreen] bounds];

Ainsi, le cadre est défini APRÈS que la fenêtre obtient son orientation à partir du contrôleur de vue racine.

44
efpies

Vous n'avez pas besoin d'ajouter de code pour résoudre ce problème.

Ouvrez le fichier xib principal et recherchez "Fenêtre" sur le côté gauche et activez Visible at Launch et Full Screen at launch.

enter image description here

22
frankish

Vérifiez votre fichier Windows nib et assurez-vous qu'il occupe le plein écran. J'ai eu un problème similaire sur mon application où les événements tactiles n'étaient pas enregistrés sur une bande sur le côté droit. Une fois que j'ai configuré mon MainWindow.xib pour occuper le plein écran, je n'ai plus eu d'erreur et les événements tactiles fonctionnaient à nouveau. Mon application était également affichée dans Paysage, mais mon MainWindow.xib avait des dimensions de portrait.

4
B H

Parfois, c'est juste un paramètre simple qui manque une valeur: cliquez sur l'élément de nom Project (quel que soit le nom de votre projet), puis assurez-vous que l'onglet General est sélectionné et faites défiler vers le bas. Recherchez icônes d'application et images de lancement assurez-vous qu'il existe une valeur dans le champ Launch Screen File, ce doit être Principal ou LaunchScreen

4
don

Si quelqu'un trouve cela utile:

Dans mon cas, j'avais utilisé

self.window = [[UIWindow alloc] init];

au lieu de

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

et c'était la raison du problème.

3
Totoro

J'obtenais cette erreur sur une ancienne application qui n'avait pas l'écran de lancement [email protected]. Lorsque les iPhones les plus grands ont été introduits pour la première fois, c'était le signal à iOS que l'application pouvait gérer la nouvelle géométrie. Sinon, il était affiché dans une fenêtre 320x480. Drôle, je n'ai même pas remarqué que l'application n'utilisait pas le plein écran.

1
user1055568

Nous avons eu le même problème, et nous avons essayé les solutions proposées dans ce fil sans succès.

Ce qui a fini par fonctionner pour nous, a été de réécrire la logique pour être purement programmatique au lieu d'utiliser xib. Après cela, nous ne voyons pas l'erreur `` fenêtre nulle inattendue '' et la vue obtient le hit sur tout l'écran.

0
micmdk

Je mets également à niveau mon ancien projet vers iOS 7 et iOS 8. En fait, je n'utilise pas MainWindow.xib, mais je crée window manuellement dans application:didFinishLaunchingWithOptions:.

Mais j'ai le même unexpected nil window in _UIApplicationHandleEventFromQueueEvent erreur après le lancement.

Donc, dans mon cas, le problème a été résolu en changeant la cible de déploiement en 6.0 et remplacement du code dans main.m:

Ancien main.m:

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

Nouveau main.m:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([YourAppDelegate class]));
    }
}
0
Anton Malmygin

Je n'ai pas pu tester la solution efpies, mais la façon dont je l'ai corrigée dans mon application était de remplacer le MainWindow.xib par un Storyboard.

0
Kenny Wyland

Dans le cas où cela aiderait quelqu'un d'autre qui trébuche ici, j'ai également eu cette erreur lorsque j'ai eu la taille UIScreen.mainScreen().bounds inversée lors de la définition du cadre de la fenêtre.

0
lipka