La présentation d'un modal-vue-contrôleur immédiatement après avoir écarté un autre
Je suis licencier un modal-vue-contrôleur, puis immédiatement à la présentation d'un autre, mais ce dernier n'arrive jamais. Voici le code:
[auto dismissModalViewControllerAnimated:YES]; UIImagePickerController *sélecteur = [[UIImagePickerController alloc] init]; sélecteur.delegate = self; sélecteur.sourceType = UIImagePickerControllerSourceTypesavedphotosalbum; [auto presentModalViewController:sélecteur de animated:YES];
La première modal VC glisse vers le bas, mais la nouvelle picker
ne vient jamais vers le haut. Aucune idée de ce qui se passe?
- Ce n'est pas une bonne idée de créer une nouvelle instance de UIImagePickerController, pouvez-vous utiliser l'ancienne ?
- pouvez-vous développer sur ce point? pourquoi serait-ce une mauvaise idée?
Vous devez vous connecter pour publier un commentaire.
Comme les autres animés choses,
dismissModalViewControllerAnimated
ne pas bloquer jusqu'à ce que le point de vue du contrôleur disparaît. Au lieu de cela il "débute" le licenciement de la vue-contrôleur. Vous pourriez avoir besoin d'utiliser un callback dansviewDidDisappear
de modal contrôleur 1 qui appelle quelque chose commemodalViewControllerDisappeared
dans la vue parent contrôleur. Dans cette méthode, vous présente modal contrôleur 2. Sinon, ce Robot K dit.viewDidDisappear
, et la condition de la course a persisté. Voir ma réponse sur cette question pour la solution qui a finalement fonctionné pour moi.Août 2012 Mise À Jour:
iOS 5 et plus ont introduit plus sûr Api pour faire des choses après des modaux ont animé dans /hors de l'endroit à l'aide de l'achèvement des blocs:
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: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 que
UIViewController
s ont une propriété publique,modalViewController
, qui monte quandpresentModalViewController:animated:
est appelé et démoli quanddismissModalViewControllerAnimated:
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 demodalViewController
et la création d'une nouvelle valeur de la manière suivante.myViewController.modalViewController
maintenant des points de modalmyViewController.modalViewController
a commencé, maismyViewController.modalViewController
la pointe toujours vers modalmyViewController.modalViewController]
maintenant les points à modale deuxmyViewController.modalViewController
à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
étaitnil
avant de tenter de présenter modal deux.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 la
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 deviewDidDisappear:
. 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 queself.modalViewController
estnil
. Alors, et alors seulement est-il "bon" pop modal deux.method not found
erreur à l'aide de l'iOS 5.0+ solution, notez la différence entredismissModalViewControllerAnimated...
etdismissViewControllerAnimated...
(leModal
est maintenant disparu). Facile de palmiers, face à l'erreur à faire.dismissViewControllerAnimated:YES completion:^{[self.delegate show2ndVC];}
fonctionne pour moi.Remarque: iOS 5.0 et ultérieures.
Ce qui se passe est que le point de vue du contrôleur supprime la référence à la modale de-vue-contrôleur une fois le rejeter animation est réalisée, ce qui arrive une fois que ce code est appelé, de sorte qu'il ne pense pas qu'il a un nouveau point de vue contrôleur de présenter modal.
Comment je fais avec, c'est de définir un
didDismissModalVC
ivar àYES
après j'appelledismissModalViewController
. Ensuite dans monviewDidAppear:
la méthode, j'ai vérifier la valeur de la ivar et présente ensuite le nouveau modal-vue-contrôleur. (Se souvenir de définir la valeur de retour deNO
donc je n'ai pas coincé éternellement rejetant modal vue des contrôleurs.)Dans ce cas, je créer délégué pour rappel parent-vue-contrôleur pour afficher la deuxième modal-vue-contrôleur.
Protocole de définition de la vue parent contrôleur:
- Je mettre en œuvre ce protocole dans la vue parent contrôleur pour afficher la deuxième modal-vue-contrôleur et de créer le délégué de la propriété
@property id<ParentViewControllerDelegate> delegate;
sur la première modal-vue-contrôleur.Montrer la première modal-vue-contrôleur de parent-vue-contrôleur:
Sur
viewDidDisappear:
méthode de la première modal-vue-contrôleur, il suffit d'appelerdelegate.showModalTwo:
pour montrer la deuxième modale de vue de parent-vue-contrôleur.Espérons que cette aide.
Dans Swift:
Votre dismissViewController devrait ressembler à ceci:
Où la mainVC maisons qui presentOtherVC:
Voici mon approche qui semble fonctionner parfaitement sur iOS 10. Ma situation est légèrement différente, mais devrait fonctionner pour la plupart des situations. Je suis a présenté le rapport initial viewController comme une liste qui nécessite un modal viewController à être présenté immédiatement.
Tout d'abord, dans la première viewController de
viewDidLoad
simplement le cacher de la vue:Puis, c'est
viewWillAppear
, présenter le modal viewController, unanimated et non-cacher de la vue sur l'achèvement:Vous aurez probablement envie de contrôler votre état avec un
Bool
de sorte que les appels suivants àviewWillAppear
ne pas re-présenter le modal, mais vous obtenez l'idée.