Essayer de fermer le controller de présentation pendant la transition

Je comstack mon projet en utilisant Xcode6 GM sur iOS8 GM. Lorsque vous rejetez plusieurs controllers de vue, mon application se bloque toujours et la zone de debugging s'affiche:

"En essayant de fermer le controller de présentation pendant la transition déjà, transitionViewForCurrentTransition n'est pas défini, le controller de présentation a été ignoré pendant la présentation?"

J'ai googlé et find un cas similaire et montre la même erreur:

[self.viewController presentViewController:vc animated:NO completion:^{ [self.viewController dismissViewControllerAnimated:NO completion:nil]; }]; 

Cela fonctionne bien en utilisant Xcode5 et iOS7. Que signifie l'erreur? Est-ce que iOS8 n'est pas content du "Hack"? Merci d'avance.

Essayez-vous de forcer un changement d'orientation de l'appareil? De toute façon, à mon avis, vous pouvez essayer de changer votre code actuel pour:

 [self.navigationController presentViewController:vc animated:NO completion:^{ dispatch_after(0, dispatch_get_main_queue(), ^{ [self.navigationController dismissViewControllerAnimated:NO completion:nil]; }); }]; 

J'ai eu le même problème et j'ai trouvé une solution propre évitez d'utiliser dispatch_async ou dispatch_after.

Simplement, comme décrit par l'exception, vous essayez de fermer un controller de vue pendant que la transition de présentation est toujours en cours. Cela signifie qu'une fois le

 - presentViewController:animated:completion: 

bloc d'achèvement est appelé, et vous appelez le rejeter, la transition n'est pas terminée.

À partir de iOS 7 en transition UIViewController a une nouvelle méthode disponible

 - transitionCoordinator 

L'outil de transitionCoordinator vous donne la possibilité de mettre en queue un bloc d'achèvement dès que la transition est terminée.

L'object renvoyé par la méthode est conforme au protocole UIViewControllerTransitionCoordinator. Sachant que la solution est vraiment simple.

Après l'invocation de

 - presentViewController:animated:completion: 

le coordinateur de transition est correctement configuré par le framework.

Utilisation

 - animateAlongsideTransition:completion: 

dessus pour envoyer le bloc d'achèvement approprié.

Voici un petit extrait de code qui explique mieux la solution

 void(^completion)() = ^() { [modalViewController dismissViewControllerAnimated:YES completion:nil]; }; // This check is needed if you need to support iOS version older than 7.0 BOOL canUseTransitionCoordinator = [viewController respondsToSelector:@selector(transitionCoordinator)]; if (animated && canUseTransitionCoordinator) { [viewController presentViewController:modalViewController animated:animated completion:nil]; [viewController.transitionCoordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { completion(); }]; } else { [viewController presentViewController:modalViewController animated:animated completion:completion]; } 

Ma solution:

dismissViewControllerAnimated: achèvement : Si vous présentez plusieurs controllers de vue successivement, créant ainsi une stack de controllers de vue présentés, l'appel de cette méthode sur un controller de vue inférieur de la stack supprime son controller de vue enfant immédiat et tous les controllers de vue au-dessus de cet enfant. Lorsque cela se produit, seule la vue la plus haute est rejetée de manière animée; les controllers de vue intermédiaire sont simplement supprimés de la stack.

Par exemple, j'ai 4 vues: A-> B-> C-> D et quand je veux rejeter B, je vérifie tout d'abord si C veut également rejeter en utilisant objc_setAssociatedObject pour attacher / détacher un object NSSsortingng, et si C veut de rejeter aussi, alors il suffit d'annuler la request de C. Appelez juste rejeter à B.

 ThirdViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"Third"]; UIViewController *VC1 = self.presentingViewController; [self dismissViewControllerAnimated:NO completion:^{}]; [VC1 presentViewController:vc animated:YES completion:^{}];