Je souhaite présenter plusieurs vues modales en séquence (par exemple, afficher une page de confirmation après avoir sélectionné une image dans le sélecteur d'image). Mon problème est que l'animation de licenciement et de présentation dans les étapes suivantes sans délai plante toujours l'application avec un EXC_BAD_ACCESS
.Plusieurs transitions de vue modale Crash App
Je suppose que le problème est que CoreAnimation
ne fait pas la distinction entre les deux transitions et ne peut pas détecter correctement si le premier est terminé ou non.
Mon travail autour jusqu'à présent est d'introduire un retard de 1 section qui semble résoudre le problème. Cependant, je pense que cela rend le code un peu fragile. Y at-il une autre solution de contournement?
Est-ce un bug dans UIKit et devrais-je soumettre un rapport de bug?
Exemple de code
est ici un cas simple qui reproduit l'accident:
Créer un nouveau projet basé Voir avec la classe suivante comme la mise en œuvre du contrôleur principal
Frapper 'annuler' lorsque la vue du sélecteur d'image est présentée
Comportement attendu: la vue du sélecteur est ignorée et présentée à nouveau en raison de l'appel suivant dans viewDidAppear
.
Comportement réel: Il se bloque avec la trace de pile présentée ci-dessous.
code:
#import "SampleViewController.h"
@implementation SampleViewController
- (void)showModal {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
[self presentModalViewController:picker animated:YES];
// [picker release];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self showModal]; // this line crashes the app
// the following works as desired
// [self performSelector:@selector(showModal) withObject:nil afterDelay:1];
}
@end
trace Stack crash:
#0 0x30b43212 in -[UIWindowController transitionViewDidComplete:fromView:toView:] #1 0x3095828e in -[UITransitionView notifyDidCompleteTransition:] #2 0x3091af0d in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] #3 0x3091ad7c in -[UIViewAnimationState animationDidStop:finished:] #4 0x00b54331 in run_animation_callbacks #5 0x00b54109 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 0x00002794 in main at main.m:14
en utilisant 0.0 comme délai résout le problème! Merci! – notnoop
+1 pour la suggestion 'beginIgnoringInteractionEvents'. Je ne savais jamais à ce sujet auparavant. – chakrit