dismissViewControllerAnimated est appelé mais ViewController n'est pas rejeté

J'ai un problème avec la méthode dismissViewControllerAnimated ne ferme pas la vue.

Ce qui se passe dans l'application ici est:

  • La cellule dans ItemViewController est sélectionnée.
  • La vue est ItemDetailViewController à ItemDetailViewController et les détails sont envoyés via un délégué
  • L'user sélectionne 'done' et l'événement est envoyé via un délégué à fermer dans ItemViewController

Tout cela fonctionne sauf pour la vue n'est pas rejetée, il n'y a pas d'erreurs. Quelqu'un peut-il voir ce qui ne va pas?

 - (void)itemDetailViewControllerDidFinish:(ItemDetailViewController *)controller { NSLog(@"Controller: %@", controller); // Returns - Controller: <ItemDetailViewController: 0x6b68b60> [self dismissViewControllerAnimated:YES completion:nil]; } 

Que faire si vous appelez [controller.navigationController popViewControllerAnimated:YES] place?

D'ailleurs, que faire si vous appelez [controller dismissViewControllerAnimated:YES completion:nil] au lieu de l'appeler soi-même?

La réponse est dans cette page: dismissviewcontrolleranimated-vs-popviewcontrolleranimated

dismissViewController est utilisé lorsque vous n'avez pas de controleur de navigation. Vous utilisez très probablement un controller de navigation, puis utilisez à la place self.navigationController popViewController.

Prenez également note de lemax sa remarque: utilisez NULL, pas nill pour le gestionnaire de complétion

J'ai eu un problème dans iOS5 où le callback d'achèvement standard ne permettait pas à la vue d'être complètement ignorée (seulement la vue poussée actuelle de ce modal)

 [controller dismissViewControllerAnimated:YES completion:^ { // }]; 

Solution pour iOS5 est de ne pas avoir un callback:

 [controller dismissViewControllerAnimated:YES completion:nil]; 

Avait un problème où appeler dismissViewControllerAnimated rejeté le keyboard dans un UIViewController, mais pas la vue elle-même.

Résolu en utilisant deux appels:

 [self dismissViewControllerAnimated:NO completion:nil]; [self dismissViewControllerAnimated:YES completion:nil]; 

un instant pour le keyboard, puis un animé pour le controller

Votre situation est – ItemViewController -> ItemDetailViewController (poussé sur navigationController) Self.dismissViewController (..) rejeter un controller de vue qui est présenté sur soi (dans le cas où il est ItemViewController). Ici, vous n'avez présenté aucun VC sur soi-même, à la place vous avez poussé un nouveau VC sur la stack de navigation. Donc, façon correcte de rejeter ItemDetailViewController serait

self.navigationController.popViewController (true). Veuillez lire la description de dismissViewController (….) pour plus de clarté.