58 votes

Présentation modulaire d'un contrôleur de vue à partir du délégué d'une feuille d'actions dans iOS8

J'ai donc remarqué que dans iOS8 bêta 3 sur iPad, lors de la tentative de présentation d'un contrôleur de vue à partir d'une méthode de délégation d'un UIActionSheet , "rien" ne se produit et un message de journal est envoyé à la console de débogage, indiquant que la présentation a été tentée lors de la transition d'un contrôleur d'alertes:

 Warning: Attempt to present <UIViewController: 0x...> on <ViewController: 0x...> which is already presenting <UIAlertController: 0x...>
 

138voto

Leo Natan Points 25262

Le problème semble venir d'Apple de passer à l'utilisation de UIAlertController en interne pour implémenter la fonctionnalité d'alerte de points de vue et des fiches d'action. Le problème c'est principalement sur l'iPad et des fiches d'action, parce que sur iPad, des fiches d'action sont présentés sous forme de liste dans une vue, et de ce que fait Apple, c'est le voyage le répondeur de la chaîne jusqu'à ce qu'il trouve une-vue-contrôleur et les appels presentViewController:animated:completion: avec l'intérieur de l' UIAlertController. Le problème est moins évident sur l'iPhone et avec alerte de points de vue, car il y a effectivement d'Apple crée une fenêtre séparée, un vide-vue-contrôleur et présente les internes UIAlertController - dessus, de sorte qu'il semble ne pas interférer avec d'autres de la présentation.

J'ai ouvert un bug report pour cette question: rdar://17742017. Merci de le dupliquer et de le laisser Apple sais que c'est un problème.

Comme solution de contournement, je vous recommande de retarder la présentation jusqu'à la prochaine runloop, à l'aide de la méthode suivante:

dispatch_async(dispatch_get_main_queue(), ^ {
    [self presentViewController:vc animated:YES completion:nil];
});

31voto

Kjuly Points 15089

Vous pouvez essayer de faire votre travail (présentation de-vue-contrôleur)

- (void)      actionSheet:(UIActionSheet *)actionSheet
didDismissWithButtonIndex:(NSInteger)buttonIndex {}

au lieu de

- (void) actionSheet:(UIActionSheet *)actionSheet
clickedButtonAtIndex:(NSInteger)buttonIndex {}

@LeoNatan dit, "Le problème semble venir d'Apple de passer à l'utilisation de UIAlertController en interne pour implémenter la fonctionnalité d'alerte de points de vue et des fiches d'action". Donc, vous devez attendre que la feuille d'action rejetée, puis présenter le point de vue du contrôleur que vous souhaitez.

@LeoNatan de la solution de bloquer l'INTERFACE utilisateur au thread principal, donc ça va assurez-vous également de la vue-contrôleur sera présenté après la fiche action a été rejetée.

4voto

Achille Points 114

malheureusement, ce code ne fonctionne pas pour moi, je pense que mon problème n'était pas l'appel de presentController méthode directement, mais dans la méthode prepareForSegue donc à l'aide d'

[segue destinationViewController]

J'ai remarqué que si la séquence est "pousser" genre " tous fonctionne correctement, mais si c'est "modal", juste à l'ipad, j'ai eu cette erreur.

Puis j'ai trouvé de nouvelle option dans le storyboard dans la séquence du panneau, et je sovled mon problème en choisissant "contexte Actuel" pour l'option de la Présentation

J'espère que ce sera utile pour quelqu'un d'autre... voici la capture d'écran de l'option

enter image description here

1voto

Salvador Points 1

Émettre un

 [self.navigationController dismissViewControllerAnimated:YES completion:nil];
 

sur

 - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
 

avant d'essayer de présenter une autre vue modale a fonctionné pour moi.

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