4

Je dessine le flux de travail d'une application où vous avez un menu principal 'Niveau 0' qui appelle une vue modale 'Niveau 1', qui appelle une autre vue modale 'Niveau 2'.iPhone - quitter la vue modale parent

Je suis en mesure d'obtenir ce travail, pas de problème et je suis en mesure de rejeter l'ensemble de la pile en utilisant:

[[[self parentViewController] parentViewController] dismissModalViewControllerAnimated:YES]; 

dans la vue modale « Niveau 2 ».

Mon problème est quand la vue modale 'Level 2' a une barre de navigation je ne peux pas rejeter toute la pile. Le code I énuméré ci-dessus ne me ramène un niveau il agit vraiment comme si je l'avais fait ceci:

[self dismissModalViewControllerAnimated:YES]; 

sur la vue modale « Niveau 2 ».

Résumé: Lorsque vue modal « Niveau 1 » appelle vue modale « niveau 2 » en utilisant les éléments suivants:

Level2 *level2 = [[[Level2 alloc] initWithNibName:@"Level2" bundle:nil] autorelease]; 
[self presentModalViewController:portalMainController animated:YES]; 

je peux rejeter l'ensemble de la pile et de revenir au menu principal (niveau 0). Mais quand « niveau 1 » appelle « niveau 2 » avec une barre de navigation comme ce qui suit:

Level2 *level2 = [[[Level2 alloc] initWithNibName:@"Level2" bundle:nil] autorelease]; 
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:level2]; 
[self presentModalViewController:navigationController animated:YES]; 
[navigationController release]; 

Je ne peux pas retourner au « niveau 0 », je ne reçois que de retour au « niveau 1 ».

Des suggestions?

Répondre

2

Je créerais un protocole pour le contrôleur de niveau 2 tel que Level2Delegate. Réglez ensuite le délégué du contrôleur de niveau 2 sur le contrôleur de niveau 1. Ensuite, vous pouvez faire quelque chose comme ce qui suit:

Niveau 2 contrôleur mettrait en œuvre ce où self.delegate est le niveau 1 contrôleur

[self.delegate controllerDidFinish:self]; 

Niveau 1 mettrait en œuvre:

- (void)controllerDidFinish:(Level2Controller *)controller { 
    [[self parentViewController] dismissModalViewControllerAnimated:NO]; 
} 

La clé est mettre en place une chaîne d'événements plutôt que d'essayer de rejeter les deux à la fois.

+0

Merci. J'ai installé un protocole Level2 mais j'ai un problème "régler le délégué du contrôleur de niveau 2 pour qu'il soit le contrôleur de niveau 1". J'ai lu quelques autres articles, mais j'ai un problème à résoudre ce problème. – CraigH

+0

Lorsque le niveau 1 instancie le contrôleur de niveau 2, vous pouvez faire level2.delegate = self; – rickharrison

+0

Génial. Merci Rick, j'ai compris. – CraigH

0

Pourquoi ne pas utiliser,

[self.navigationController popToRootViewControllerAnimated:YES]; 
Questions connexes