12 votes

Retour à RootViewController à partir de Modal View Controller

À partir de la vue Home - mon RootViewController - j'ouvre deux ViewControllers l'un après l'autre au fur et à mesure que l'utilisateur progresse dans la hiérarchie de navigation, comme suit :

1) SecondViewController est poussé par un bouton connecté dans mon Storyboard

2) Le ThirdViewController est présenté de manière modale

[self performSegueWithIdentifier:@"NextViewController" sender:nil];

Le tableau est donc le suivant : RootViewController -> SecondViewController -> ThirdViewController

Maintenant, dans mon ThirdViewController, je veux avoir un bouton pour revenir 2 fois à mon RootViewController, c'est-à-dire rentrer à la maison. Mais cela ne fonctionne pas :

[self.navigationController popToRootViewControllerAnimated:YES]; 

Seul ce type retourne une fois au SecondViewController

[self.navigationController popViewControllerAnimated:YES];

Comment puis-je supprimer les contrôleurs de vue modal et poussé en même temps ?

21voto

Steph Sharp Points 3347

J'ai eu une situation similaire, où j'ai eu un certain nombre de contrôleurs de vue poussés sur la pile de contrôleurs de navigation, puis la dernière vue a été présentée de manière modale. Sur l'écran modal, j'ai un bouton Annuler qui renvoie au contrôleur de vue racine.

Dans le contrôleur de la vue modale, j'ai une action qui est déclenchée lorsque l'on appuie sur le bouton Annuler :

- (IBAction)cancel:(id)sender
{
    [self.delegate modalViewControllerDidCancel];
}

Dans l'en-tête de ce contrôleur de vue modale, je déclare un protocole :

@protocol ModalViewControllerDelegate
- (void)modalViewControllerDidCancel;
@end

Ensuite, le dernier contrôleur de vue de la pile de navigation (celui qui a présenté la vue modale) doit implémenter la méthode ModalViewControllerDelegate protocole :

- (void)modalViewControllerDidCancel
{
    [self dismissViewControllerAnimated:NO completion:nil];
    [self.navigationController popToRootViewControllerAnimated:YES];
}

La méthode ci-dessus est la partie importante. Elle demande au contrôleur de présentation de fermer la fenêtre modale, puis elle revient au contrôleur de la vue racine. Notez que je passe NO à dismissViewControllerAnimated : et YES à popToRootViewControllerAnimated : pour obtenir une animation plus fluide de la vue modale à la vue racine.

4voto

cfc16 Points 61

J'avais le même besoin mais j'utilisais des séquences personnalisées entre les contrôleurs de vue. J'ai découvert le concept de "Unwind Segue" qui, je pense, est apparu avec iOS6. Si vous ciblez iOS6 et plus, ces liens pourraient vous aider : À quoi servent les séquences de détente et comment les utilisez-vous ? http://chrisrisner.com/Unwinding-with-iOS-and-Storyboards Merci.

0voto

Adam Richardson Points 2207

En supposant que votre AppDelegate s'appelle AppDelegate, vous pouvez faire ce qui suit, qui réinitialisera le rootviewcontroller de la fenêtre d'application en tant que RootViewController de la vue.

AppDelegate *appDel = (AppDelegate*)[[UIApplication sharedApplication] delegate];
RootViewController *rootView = [[RootViewController alloc] init];
[appDel.window setRootViewController:rootView];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X