30 votes

iPhone en panne lors de la présentation du contrôleur de vue modale

Je suis en train d'afficher un modal vue tout de suite après un autre point de vue a été présenté modal (le deuxième est un chargement de vue qui apparaît).

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Show load
    LoadViewController *loader = [[LoadViewController alloc] init];
    [self presentModalViewController: loader animated:NO];
    [loader release];
}

Mais quand je fais cela, je reçois un "Programme de signal reçu: "EXC_BAD_ACCESS"." erreur.

La trace de la pile est:

0  0x30b43234 in -[UIWindowController transitionViewDidComplete:fromView:toView:]
1  0x3095828e in -[UITransitionView notifyDidCompleteTransition:]
2  0x3091af0d in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:]
3  0x3091ad7c in -[UIViewAnimationState animationDidStop:finished:]
4  0x0051e331 in run_animation_callbacks
5  0x0051e109 in CA::timer_callback
6  0x302454a0 in CFRunLoopRunSpecific
7  0x30244628 in CFRunLoopRunInMode
8  0x32044c31 in GSEventRunModal
9  0x32044cf6 in GSEventRun
10 0x309021ee in UIApplicationMain
11 0x00002154 in main at main.m:14

Des idées? Je suis totalement perplexe! Le chargement de la vue est vide, donc il n'y a absolument rien là-dedans qui est à l'origine de l'erreur. Est-il quelque chose à faire avec le lancement de 2 points de vue modal dans la même boucle d'événement ou quelque chose?

Merci,

Mike

Edit: Très étrange... j'ai modifié légèrement de sorte que le chargement de la vue s'affiche après un petit retard, et cela fonctionne très bien! Il semble être quelque chose dans le même événement en boucle!

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Show load
    [self performSelector:@selector(doit) withObject:nil afterDelay:0.1];
}

- (void)doit {
    [self presentModalViewController:loader animated:YES];  
}

30voto

Michael Waterfall Points 10490

Je l'ai légèrement modifié pour que la vue de chargement s'affiche après un petit délai, et cela fonctionne bien! Cela semble donc être quelque chose dans la même boucle d'événement!

 - (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Show load
    [self performSelector:@selector(doit) withObject:nil afterDelay:0.1];
}

- (void)doit {
    [self presentModalViewController:loader animated:YES];  
}
 

5voto

Daniel Points 1268

Je crois que j'ai reproduit la même erreur dans l'iOS 4. Dans mon application, l'incident s'est produit de façon constante lorsque vous tentez d'afficher une deuxième modal vue immédiatement après avoir dévoilé une première vue modal. J'ai lutté pendant quelques heures à passer pour un fou.

Après avoir lu les messages de ce fil, j'ai essayé de créer un simple, reproductible exemple à l'aide de la Barre d'Onglet modèle d'Application. J'ai été en mesure d'utiliser le UIImagePickerController pour montrer la première modal vue après la réponse à un clic sur un bouton dans "FirstViewController.m". Quand j'ai essayé de montrer la UIImagePickerController à nouveau (après la manipulation du imagePickerControllerDidCancel message), l'application s'est écrasé avec la même erreur.

Sur le périphérique, il n'y avait tout simplement aucune idée de ce qui se passait. Cependant, quand j'ai couru le code sur le Simulateur, j'ai été assez chanceux pour obtenir ce message sur la console:

Il semble donc que mon seul choix est de suivre les conseils de la message d'erreur et tout simplement attendre jusqu'à ce que viewDidAppear (à l'aide d'un indicateur pour indiquer que je suis dans ce mode spécial) et puis charger le deuxième modal vue.

Ici la trace de la pile pour l'exhaustivité:

** Appel de la pile au premier lancer:
(
 0 CoreFoundation 0x0238c919 __exceptionPreprocess + 185
 1 libobjc.Un.dylib 0x024da5de objc_exception_throw + 47
 2 CoreFoundation 0x02345078 +[NSException lever:format:arguments:] + 136
 3 Fondation 0x000ab8cf -[NSAssertionHandler handleFailureInMethod:objet:dossier:lineNumber:description:] + 116
 4 UIKit 0x00544317 -[UIWindowController transition:fromViewController:toViewController:cible:didEndSelector:] + 212
 5 UIKit 0x0035c769 -[UIViewController presentModalViewController:withTransition:] + 2937
 6 TestTempDelete 0x000021cf -[FirstViewController showImagePicker] + 167
 7 Fondation 0x0002fcea __NSFireDelayedPerform + 441
 8 CoreFoundation 0x0236dd43 __CFRUNLOOP_EST_APPEL_OUT_DE_LA_MINUTERIE_CALLBACK_FONCTION__ + 19
 9 CoreFoundation 0x0236f384 __CFRunLoopDoTimer + 1364
 10 CoreFoundation 0x022cbd09 __CFRunLoopRun + 1817
 11 CoreFoundation 0x022cb280 CFRunLoopRunSpecific + 208
 12 CoreFoundation 0x022cb1a1 CFRunLoopRunInMode + 97
 13 GraphicsServices 0x02bf12c8 GSEventRunModal + 217
 14 GraphicsServices 0x02bf138d GSEventRun + 115
 15 UIKit 0x002beb58 UIApplicationMain + 1160
 16 TestTempDelete 0x00001eb4 principal + 102
 17 TestTempDelete 0x00001e45 début + 53

Espérons que cette aide.

4voto

user353877 Points 693

** Comme on l'a dit plus tôt, utilisez isIgnoringInteractionEvents

 //Check if the app is ignoring interatctions, if so, add a delay for 1 sec
if([[UIApplication sharedApplication] isIgnoringInteractionEvents]==TRUE) {
        [currentViewController performSelector:@selector(presentModalViewController:animated:) withObject:screen afterDelay:1];
    } else {
        [currentViewController presentModalViewController:screen animated:YES];
    }
 

3voto

Simon Points 31

Il est possible que si vous obtenez cela après avoir cliqué sur un bouton lié à votre code dans Interface Builder, vous avez deux actions liées à un seul bouton (peut-être si vous aviez une vue modale liée à un bouton, puis dupliqué le bouton et lié une autre vue modale). Cela va essayer de les renvoyer tous les deux et donc cela échouera avec ce message.

3voto

Eddy Points 31

J'ai rencontré la même exception

Résiliation d'application en raison de uncaught exception 'NSInternalInconsistencyException', la raison: 'vous essayez de commencer une modale de transition pendant une période de transition est déjà en cours. Attendre viewDidAppear/viewDidDisappear à savoir la transition actuelle est terminé"

Comme suggéré plus tôt, j'ai essayé de retarder la présentation d'un modal de la transition, mais qui n'aide pas vraiment. J'ai alors découvert que j'avais de multiples IBActions connecté à mon bouton de TouchUpInside événement!!!. Dans mon cas, deux IBActions serait de commencer: la présentation d'un sélecteur de personnes modal et de présenter une image sélecteur de modal. C'est ce qui explique le message d'erreur. Vérifiez si vous disposez de plusieurs IBActions connecté!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X