2 votes

Comment revenir au premier contrôleur de vue dans une pile de navigation

J'ai un problème avec le déroulement de ma vue vers l'écran de connexion. La structure du storyboard est la suivante : Structure du storyboard

Le flux d'utilisation de l'application est comme suit : l'utilisateur se connecte sur LoginVC -> accède à l'écran principal de l'onglet barre par segue modal -> sur chaque élément de la barre d'onglets, j'ai ajouté un bouton de droite sur le contrôleur de navigation pour accéder à la page de profil, chaque élément de la barre d'onglets a un contrôleur de navigation indépendant pour maintenir la structure linéaire du contrôleur de navigation. -> une fois que je clique sur le bouton de la page de profil, la page de profil est présentée de manière modale -> lorsque le bouton de déconnexion sur la page de profil est cliqué, cela déclenche le déroulement du segue et rejette le contrôleur de la vue

func logoutUser(){

        //Networking.logoutUser()
        print("Il va vers la connexion")
        self.performSegue(withIdentifier: "unwindToLogin", sender: self)
}

Le déroulement du segue a été implémenté sur LoginVC sur le VC le plus à gauche. J'ai connecté le déroulement du segue sur l'écran de profil et l'ai appelé "unwindToLogin" J'ai simplement utilisé performSegueWithIdentifier. Cependant, la méthode n'est pas appelée et rien ne se passe sur la vue.

Édition 1 : Je me demande si, puisque j'appelle la page de profil modale sur le contrôleur d'onglet, il ne pouvait pas trouver unwindToLogin. Si j'utilise simplement le instantiateviewcontoller pour appeler la connexion, cela effacera-t-il ma pile de contrôleurs de vue ?

Édition 2: Désolé, j'ai oublié que lorsque je vérifie si un utilisateur est connecté, j'utilise le code suivant :

    if (FIRAuth.auth()?.currentUser != nil) {
        self.storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
        self.window?.rootViewController = self.storyboard?.instantiateViewController(withIdentifier: "TabBarViewController")
    }

En réalité, ils ne peuvent pas trouver la méthode de déroulement car la vue racine n'est pas le contrôleur de vue de connexion principal.

Est-ce que quelqu'un peut m'aider ?

3voto

NandhaKumar Points 656

Déplacez-vous vers n'importe quel contrôleur de vue en utilisant un déroulement inversé.

Pour vous déplacer vers n'importe quel contrôleur de vue lorsque vous cliquez sur un bouton.

- (IBAction)unwindToCurrentController:(UIStoryboardSegue *)unwindSegue { }

  • Ajoutez ces lignes ci-dessus à votre fichier loginViewController.m (ou) ajoutez ces lignes au contrôleur de vue vers lequel vous voulez vous déplacer.
  • En fait, vous voulez vous déplacer vers le contrôleur de vue de connexion lorsque vous cliquez sur un bouton. Donc, créez un bouton ou choisissez un bouton pour cet événement.
  • Avant de faire cela, vous voulez ajouter le code ci-dessus à votre contrôleur de vue de connexion. Maintenant, ajoutez une action à votre bouton en le faisant glisser vers l'option Exit dans le contrôleur de vue en haut.
  • Cela montre une option de déroulement inversé unwindToCurrentController. Cliquez sur cette option et connectez-la.

Maintenant, construisez et exécutez votre application. Ça fonctionne parfaitement.

1voto

vacawama Points 91151

Vous devez créer le segue de déroulement sur chaque ViewController sur lequel vous souhaitez l'appeler. Ils peuvent tous utiliser la même destination @IBAction dans l'écran de connexion et peuvent tous être appelés "unwindToLogin".

Je vois le segue de déroulement défini sur le MainTabBarController. Dans votre UserProfileController, vous devez faire glisser en maintenant control de l'icône View Controller vers l'icône Exit puis sélectionner votre @IBAction dans la fenêtre contextuelle. Ensuite, trouvez ce segue de déroulement dans le UserProfileController dans l'arborescence du document et attribuez-lui l'identifiant "unwindToLogin".


En réponse à votre Edit 2:

Étant donné que votre viewController initial a été mis en place de manière programmatique, il n'est pas possible de remonter jusqu'au LoginViewController. Dans ce cas, placez le @IBAction de destination dans votre MainTabBarController et faites-le définir le self.window?.rootViewController sur l'écran de connexion.

-1voto

JoeShmoe Points 22

Vous pourriez essayer ceci, cela a fonctionné pour moi.

[self.presentingViewController dismissViewControllerAnimated:NO completion:nil];

Je l'utilise pour fermer une vue modale afin de pouvoir retourner à la vue d'origine.

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