Août 2012 Mise À Jour:
iOS 5 et plus ont introduit plus sûr Api pour faire des choses après les auxiliaires modaux ont animé dans / hors de l'endroit à l'aide de l'achèvement des blocs:
[self presentViewController:myModalVC animated:YES completion:^{}];
[self dismissViewControllerAnimated:YES completion:^{}];
Pré-Août 2012 Réponse:
J'ai rencontré un problème similaire lors du rejet de modal et de la présenter modal deux en succession rapide. Parfois modal deux spectacle après le modal a été rejeté, et parfois modal deux ne semble pas du tout et qui m'a rendu très triste.
Ressemble à une condition de course pour moi...
Mettre un+ 1 seconde de retard sur l'appelant de la méthode présentée modal deux, showModalTwo
, fait modal deux apparaissent à chaque fois après le modal a été rejetée:
- (void)didDismissModalOne {
[self performSelector:@selector(showModalTwo:)
withObject:someNumber
afterDelay:1.0f];
}
Cela a confirmé un soupçon qu'il y avait une sorte de course entre le licenciement de modal et de la présentation du modal deux. Mettre un délai sur l'appelant, toutefois, est inélégant et n'a pas de garantie que la condition de la course ne serait pas ré-apparaître dans d'autres circonstances.
Le problème
S'avère qu' UIViewController
s ont une propriété publique, modalViewController
, qui est défini lors de l' presentModalViewController:animated:
est appelé et démolie lors de l' dismissModalViewControllerAnimated:
est appelé. Le hic, c'est qu'elle n'est pas déchirée vers le bas de manière synchrone, il est possible de créer une compétition entre la dépose de l'ancienne valeur de modalViewController
et la création d'une nouvelle valeur de la manière suivante.
- Présent modal.
myViewController.modalViewController
maintenant des points de modal
- Rejeter modal. Processus d'arrière-plan pour abattre
myViewController.modalViewController
a commencé, mais myViewController.modalViewController
encore des points de modal
- Présent modal deux,
myViewController.modalViewController]
maintenant les points à modale deux
- Système de rappel incendies, la création d'
myViewController.modalViewController
de nil
, cela interrompt le processus de modal deux l'animation et le résultat est que l'utilisateur ne la voit jamais.
La course démarre à l'étape 2 et se manifeste à l'étape 4.
La solution
Ma solution a été de mettre un garde de la condition sur la méthode présentée modal deux pour s'assurer que myViewControoler.modalViewController
a nil
avant de tenter de présenter modal deux.
-(void)showModalTwo:(NSNumber *)aParameter {
if (self.modalViewController) {
[self performSelector:@selector(showModalTwo:)
withObject:aParameter
afterDelay:0.1f];
return;
}
// You can now present the second modal safely.
}
A travaillé comme un charme. Une solution plus élégante peut inclure un délai d'attente.
Post script
Je n'ai vraiment pas comme les bureaux de l'aspect de cette solution. @Nemrod suggère, dans la accepté de répondre à cette question, que vous pouvez lancer la présentation du modal deux de l' viewDidDisappear:
méthode de modal. J'ai bien aimé le son de cet événement approche axée sur, mais après avoir fait une mise en œuvre complète dans mon cas d'utilisation, je confirme que la condition de la course a persisté lors de la présentation de modal deux à l'aide d'un rappel à l'intérieur d' viewDidDisappear:
. La seule façon d'être absolument certain que le modal deux sera présenté est de sondage à l'intérieur de la vue parent contrôleur jusqu'à ce que vous êtes absolument sûr qu' self.modalViewController
est nil
. Alors, et alors seulement est-il "bon" pop modal deux.