web-dev-qa-db-fra.com

licencier ViewControllerAnimated est appelé mais ViewController n'est pas licencié

J'ai un problème avec la méthode dismissViewControllerAnimated qui 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 Poussez ed en ItemDetailViewControlleret les détails sont envoyés par un délégué
  • L'utilisateur sélectionne 'done' et l'événement est envoyé via un délégué à fermer dans ItemViewController

Tout cela fonctionne sauf que la vue n'est pas rejetée, il n'y a pas d'erreur. 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];
}
43
Ad Taylor

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

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

66
Nick Lockwood

La réponse se trouve dans cette page: licenciementviewcontrolleranimated-vs-popviewcontrolleranimated

licenciementViewController est utilisé lorsque vous n’avez pas de contrôleur de navigation . Vous utilisez probablement un contrôleur de navigation, puis utilisez self.navigationController popViewController à la place.

Prenez également note de la remarque de lemax: utilisez NULL, pas nill pour le programme d'achèvement

10
Leander

Il y avait un problème où appeler dismissViewControllerAnimated renvoyait le clavier d'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 clavier, puis un animé pour le contrôleur

4
Cbas

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

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

Solution pour iOS5 est de ne pas avoir de rappel:

[controller dismissViewControllerAnimated:YES completion:nil];
4
Danoli3

Votre situation est - ItemViewController -> ItemDetailViewController (poussé sur navigationController) Self.dismissViewController (..) rejette un contrôleur de vue présenté sur soi (dans le cas où il s’agit de ItemViewController). Ici, vous n'avez pas présenté de VC sur vous-même, mais vous avez poussé un nouveau VC sur la pile de navigation. Ainsi, le moyen correct de rejeter ItemDetailViewController serait

self.navigationController.popViewController (true). veuillez lire la description de licencierViewController (....) pour plus de clarté.

0
Arya