2010-07-11 5 views
2

View Le contrôleur A présente le contrôleur B de façon modale, qui dispose d'un bouton permettant de présenter le contrôleur C de façon modale.Suppression des contrôleurs de vue modale

Voici mon flux:

A presents B which presents C 

Lorsque B présente C, je veux B à rejeter, donc mes contrôleurs que de vue sont A et C. Je ne sais pas où appeler:

[self dismissModalViewControllerAnimated:NO]; 

afin de rejeter B.

J'ai créé un modèle de délégation, où juste après B présente C, a rejettera B mais rien ne se rejeté.

Si B est le délégué de C, C se ferme automatiquement.

Répondre

0

Pour ce faire, vous devez utiliser un UINavigationController. * Créer un contrôleur de navigation avec le contrôleur B en tant que contrôleur de vue racine. * A présente le contrôleur de navigation comme modal avec presentModalViewControler: animé: cela aura le même effet que la présentation B * Lorsque B doit présenter C, il le pousse vers la pile du contrôleur de vue de navigation en appelant [self.navigationController pushViewController: C Animé: OUI] * Si C doit être rejeté pour critiquer B, vous pouvez le faire en appelant [self.navigationController popViewControllerAnimated: YES] * Si C doit ignorer et vider A, vous pouvez ignorer le modal en appelant [self.navigationController .parentViewController dismissModalAnimated: YES]

Vous pouvez aller un pas plus loin et ne pas utiliser de modal du tout en intégrant A comme contrôleur de vue racine d'un contrôleur de navigation et en poussant B vers le contrôleur de navigation au lieu de présen Je le pense comme un modal

+0

je dois présenter et rejeter les contrôleurs de vue modal en raison de la Ainsi, mon application est conçue Les vues modales sont des contrôleurs de tabulation qui ne peuvent être affichés que de manière modale. –

+0

Il me semble qu'il y a un problème avec la conception des applications. Vous êtes en train de combattre le cadre, ce n'est jamais une bonne idée et cela conduira à des problèmes plus tard. Cependant, je pense qu'il peut y avoir une solution ... A présente B normalement. Lorsque B présente C, faites ce qui suit (en supposant que self est une instance de B): [self.parentViewController dismissModalViewControllerAnimated: NO]; [self.parentViewController presentModalViewControler: C animé: OUI]; La première ligne peut ne pas être nécessaire. – Blueneon

0

Je pense que vous ne pouvez pas le faire. Relancez la documentation pour dimissing the modal view controller

Si vous présentez successivement plusieurs contrôleurs de vue modale et créez ainsi une pile de contrôleurs de vue modale, l'appel de cette méthode sur un contrôleur de vue inférieur de la pile supprime son contrôleur de vue enfant immédiat et toutes les vues contrôleurs au-dessus de cet enfant sur la pile. Lorsque cela se produit, seule la vue la plus haute est rejetée de manière animée; les contrôleurs de vue intermédiaire sont simplement supprimés de la pile. La vue la plus haute est ignorée à l'aide de son style de transition modale, qui peut différer des styles utilisés par les autres contrôleurs de vue situés plus bas dans la pile.

Cela signifie que si vous rejetez B, C vous rejeter ainsi

+0

Pensée: Est-il possible de conserver une référence à A, dans B. Alors avoir cette référence de A, dans B, présenter C? Je peux alors renvoyer B et continuer à montrer C car il ne sera pas rejeté par B? –

+0

J'ai essayé ce qui précède, sans chance. –

+0

Je pense que vous ne pouvez pas faire cela. La meilleure façon de faire est d'utiliser quelques astuces: d'abord utiliser un B présent, puis rapidement B sans animation, et présenter C. Je ne suis pas sûr que cela fonctionnera dans votre cas – vodkhang

0

font tout cela d'un

[self.navigationController dismissModalViewControllerAnimated:YES]; 
+0

Bon conseil. C'est ce que j'ai fait pour le faire fonctionner: C appelle B qui appelle A qui fournit votre code. –

+0

vous pouvez le faire de partout où vous voulez dans une chaîne de navigationcontroller ... mais je pense vraiment que vous devriez considérer qui est en contrôle de quoi. les enfants ne devraient pas être conscients de la façon dont il est mis en œuvre par ses parents. – hfossli

1

Je pense que vous pouvez utiliser NSNotificationCenter. Vous pouvez créer un NSNotificationCenter en B appelant une méthode pour se fermer, puis effectuer une post-notification à partir de C pour appeler le NSNotificationCenter à B.

Je ne suis pas sûr de cela, mais cela peut fonctionner.

In B ajouter:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissFunction:) name:@"DismissFunction" object:nil]; 

et la méthode comme ceci:

- (void)dismissFunction:(NSNotification*)notification 
{ 
     [self.navigationController dismissModalViewControllerAnimated:YES]; 
} 

Et en C ajouter:

[[NSNotificationCenter defaultCenter] postNotificationName:@"DismissFunction" object:nil]; 
Questions connexes