web-dev-qa-db-fra.com

Comment revenir à un UIViewController déjà chargé?

J'ai une vue sur un storyboard qui a un bouton pour effectuer une certaine action. Toutefois, pour effectuer cette action, l'utilisateur doit être connecté. Le gestionnaire de boutons vérifie si l'utilisateur est connecté et effectue une séquence si OUI et une autre si NON. Les séquences NO poussent vers un contrôleur de vue de connexion. Une autre connexion est en cours de connexion avec le premier contrôleur de vue. Par conséquent, si la connexion est réussie, l'utilisateur peut reprendre le travail là où il l'a laissé. Les contrôleurs de vue sont intégrés à un contrôleur de navigation.

Le problème, c'est que la séquence 'return' charge une toute nouvelle instance du contrôleur de vue et ne fait pas référence à l'instance d'origine. Je me retrouve donc avec des éléments d'interface vides et deux copies de ce contrôleur de vue en mémoire.

Comment puis-je revenir à l'instance d'origine du contrôleur de vue?

47
TijuanaKez

En supposant que vous utilisez "Push", vous voulez dire que vous utilisez un UINavigationController, vous pouvez alors utiliser ce qui suit pour revenir au sommet de la pile.

[self.navigationController popToRootViewControllerAnimated:YES];

ou

UIViewController *prevVC = [self.navigationController.viewControllers objectAtIndex:<n>];
[self.navigationController popToViewController:prevVC animated:YES];

pour passer à un niveau spécifique où <n> est le niveau.

ou

[self.navigationController popViewControllerAnimated:YES];

Si vous voulez juste faire apparaître un niveau, sauvegardez la pile de navigation.

137
Mick MacCallum

Au lieu d'utiliser une séquence pour revenir au contrôleur précédent, vous devez utiliser l'événement associé à la séquence pour renvoyer le contrôleur de vue actuel (si la séquence était modale) ou le supprimer du contrôleur de navigation (si la séquence était Appuyez sur) et le contrôleur précédent s'affichera automatiquement.

Par exemple, si la séquence modale renvoyée était exécutée lorsque vous avez appuyé sur un bouton de votre écran de connexion, vous supprimez la séquence du storyboard et, lors de la retouche à l'intérieur du bouton, vous créez un lien avec votre action. appellera:

 [self dismissViewControllerAnimated:YES completion:nil];

Sur le storyboard, cliquez avec le bouton droit de la souris sur le bouton et faites glisser l'événement de retouche dans l'événement envoyé vers le premier intervenant de la scène du contrôleur de vue. Ceci exécutera la transition inverse qui a été exécutée lorsque vous avez effectué la transition de transition. Vous pouvez utiliser un segment modal pour cela, pas besoin d'utiliser un contrôleur de navigation.

Si vous avez poussé la vue de connexion sur le contrôleur de navigation, vous devez la sortir de la pile (si vous revenez à la vue précédente). Utilisez l'un de ceux-ci:

    [[self navigationController] popViewControllerAnimated:YES];  // goes back to previous view
[[self navigationController] popToViewController: myViewControllerAfterLogin animated:YES]; // goes back to specific view on stack. 
[[self navigationController] popToRootViewControllerAnimated:YES]; // goes back to first view on the stack

La transition animée doit inverser le type de transition utilisé sur la séquence, de sorte que vous vous courbez lorsque vous quittez la vue.

33
TRVD1707

Si vous utilisez une séquence pour avancer, vous devez utiliser une séquence de détente pour revenir en arrière. Des informations détaillées sur l’utilisation d’un segment de déroulement se trouvent dans cette Note technique TN2298 Utilisation des segments de retrait .

5
malhal

malhal a raison - cela vaut la peine de cliquer sur son lien.

Le code semble avoir légèrement évolué par rapport à l'exemple d'Apple et est encore plus flexible. J'ai trois scènes mais un seul fichier ViewController .m personnalisé. Je ne voulais pas de pile de navigation. L'accès aux scènes suivantes se fait par tranches de boutons. J'ai ajouté cette ligne dans le fichier .m du contrôleur de vue de base:

- (IBAction)unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC{}

Puis, dans la troisième scène, j'ai fait glisser un bouton de la souris sur l'icône de sortie et sélectionné l'action de déroulement. Il revient maintenant de la scène 3 à la scène 2 sans avoir à appeler une méthode de renvoi (ViewView).

2
Tim