web-dev-qa-db-fra.com

Comment effectuer unwind segue par programmation?

Utiliser le storyboard est très facile. Vous faites simplement glisser l'action vers "Quitter". Mais comment dois-je l'appeler depuis mon code?

296
tadasz
  1. Créer un segue manuel (ctrlglisser-déplacer du propriétaire du fichier vers la sortie),
  2. Choisissez-le dans le menu gauche du contrôleur sous le bouton vert EXIT.

Choose it in the Left Controller Menu below green EXIT button

Insérer le nom de la séquence à décompresser.

Ensuite, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender. avec votre identifiant de lieu.

276
Vadim

Voici une réponse complète avec Objective C et Swift:

1) Créez un IBAction _ déroulement de la séquence dans votre contrôleur de vue de destination (où vous souhaitez effectuer la séquence). N'importe où dans le fichier d'implémentation.

// Objective C

    - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

2) Sur le contrôleur de vue source (le contrôleur que vous êtes en train de quitter), + déplacez le curseur de "Nom de l'activité" pour quitter. Vous devriez voir la séquence de déroulement créée à l’étape 1 dans la fenêtre contextuelle. (Si vous ne le voyez pas, passez à l’étape 1). Choisissez unwindToContainerVC: dans la fenêtre contextuelle, ou quel que soit le nom que vous avez donné à votre méthode pour connecter votre contrôleur source à l'IBAction de déroulement.

enter image description here

3) Sélectionnez le segment dans le contour du storyboard du contrôleur de la vue source (il sera listé près du bas) et attribuez-lui un identifiant.

enter image description here

4) Appelez la séquence de déroulement à l’aide de cette méthode à partir du contrôleur de vue source en remplaçant le nom de la séquence de déroulement.

// Objectif c

[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];

// Rapide

self.performSegueWithIdentifier("unwindToContainerVC", sender: self)

NB Utilisez la propriété sourceViewController du paramètre segue sur la méthode de déroulement pour accéder aux propriétés exposées du contrôleur source. En outre, notez que la structure gère la suppression du contrôleur de source. Si vous souhaitez le confirmer, ajoutez une méthode dealloc au contrôleur source avec un message de journal qui devrait se déclencher une fois qu'il a été tué. Si dealloc ne se déclenche pas, vous pouvez avoir un cycle de conservation.

156
smileBot

La réponse de bradleygriffith était excellente. J'ai pris l'étape 10 et fait une capture d'écran pour simplifier. Ceci est une capture d'écran dans Xcode 6.

Il vous suffit de faire glisser l’icône orange vers l’icône rouge de sortie pour créer un déroulement sans action ni bouton dans la vue.

enter image description here

Puis sélectionnez le unwind segue et définissez un identifiant pour y accéder à partir du code.

enter image description here

Dans du code,

[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
75
Dean

J'ai utilisé [self dismissViewControllerAnimated: YES completion: nil]; qui vous ramènera à l'appelant ViewController.

13
Larry Gibson

Citation de texte à partir de la note technique d'Apple sur Unwind Segue: pour ajouter une séquence de déroulement qui ne sera déclenchée que par programme, faites glisser tout en appuyant sur l'icône de contrôleur de vue de la scène jusqu'à son icône de sortie, puis sélectionnez une action de déroulement pour la nouvelle séquence dans le menu contextuel.

Lien vers la note technique

11
Vishal Chaudhry

La réponse de Vishal Chaudhry ci-dessus a fonctionné pour moi. J'ajouterais également que pour déclencher manuellement le seque en utilisant:

[self performSegueWithIdentifier:@"mySegueName" sender:self];

à partir de ViewController, vous devez également sélectionner la séquence de déroulement sous la scène de ViewController dans le storyboard et dans la vue des propriétés de RHS, pour vous assurer que le champ Indentifier contient le nom auquel vous faites référence dans le code ("mySegueName" dans l'exemple ci-dessus. ).

Si vous omettez cette étape, la ligne ci-dessus générera une exception indiquant que le nom de paire est inconnu.

6
Jason Crocker

Solution compatible avec les versions antérieures qui fonctionnera pour les versions antérieures à ios6, pour les personnes intéressées:

- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {

    for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
        UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
        if ([vc isKindOfClass:vcClass]) {
            [self.navigationController popToViewController:vc animated:animated];
            return;
        }
    }
}
3
Joel Teply

Swift 4.2, Xcode 10+

Pour ceux qui se demandent comment faire cela avec les VC non configurés via le storyboard (ceux qui arrivent à cette question après une recherche "` par programme "+" undind segue ").

Étant donné que vous ne pouvez pas configurer une séquence de déroulement par programmation, la solution la plus simple, uniquement par programmation, consiste à appeler:

navigationController?.popToRootViewController(animated: true)

ce qui fera apparaître tous les contrôleurs de vue de la pile sur votre contrôleur de vue racine.

1
zb1995

Swift 4 :

1. Créez un @ IBAction avec le contrôleur à l'intérieur du contrôleur que vous souhaitez décompresser. à:

    @IBAction func unwindToVC(segue: UIStoryboardSegue) {

    }

2. Dans le storyboard, à partir du contrôleur que vous souhaitez séparer (dérouler) de Ctrl + glisser du signe du contrôleur pour quitter le signe et choisir la méthode que vous avez créée. plus tôt:

enter image description here

3. Vous pouvez maintenant remarquer que dans le plan du document, vous avez une nouvelle ligne avec le titre "Unwind segue ....". Maintenant, vous devez cliquer sur cette ligne et ouvrir l'inspecteur d'attributs pour définir l'identifiant (dans mon cas unwindSegueIdentifier ).

enter image description here

4. Vous avez presque terminé! Vous devez maintenant ouvrir le contrôleur de vue à partir duquel vous souhaitez vous détendre et créer une méthode qui effectuera le suivi. Par exemple, vous pouvez ajouter un bouton, le connecter avec le code avec @ IBAction , après cela, dans cet élément IBAction ajouter perfromSegue (withIdentifier: expéditeur:) méthode:

     @IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
         performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
     }

C'est tout ce que vous avez à faire!

0
wm.p1us

FYI: Pour que la réponse de @ Vadim fonctionne avec une action de détente manuelle appelée depuis un contrôleur de vue, vous devez passer la commande suivante:

[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];

à l'intérieur de la méthode de classe overriden viewDidAppear comme ceci:

-(void) viewDidAppear:(BOOL) animated
{
    [super viewDidAppear: animated];

    [self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}

Si vous le mettez dans d'autres méthodes ViewController comme viewDidLoad ou viewWillAppear, il sera ignoré.

0
John Verco