web-dev-qa-db-fra.com

préparateur émetteur PreparForSegue et PerformSegueWithIdentifier

Je m'interroge sur le fonctionnement des fonctions du titre et sur le paramètre expéditeur. 

Supposons qu'un clic sur un bouton appelle la méthode performSegue. Est-ce que cela appelle également la méthode prepareSegue? La méthode prepareSegue est-elle appelée avant la méthode performSegue mais après avoir appuyé sur le bouton?

De plus, le paramètre "sender" dans les deux fonctions est-il lié? Si je transmets une chaîne en tant qu'expéditeur dans la méthode performSegue, cela sera-t-il transféré vers le paramètre expéditeur dans la méthode prepareSegue? En d'autres termes, si je configure le paramètre sender dans la méthode performSegue sur "Hi world", le paramètre sender dans la méthode prepareSegue sera-t-il également la même chaîne? 

Merci

5
JasonP

Il existe effectivement deux manières de déclencher une transition. La première consiste à effectuer une action sur un élément d'interface utilisateur dans Interface Builder, la seconde à utiliser performSegueWithIdentifier:sender: dans votre code. Je dis 'effectivement', car sous les couvertures, lorsque la scène est chargée depuis le storyboard, un gestionnaire d'action est configuré pour appeler finalement performSegueWithIdentifier:sender:

Lorsque performSegueWithIdentifier:sender: est appelé, l'objet Segue est remis à la fonction prepareForSegue:sender: de votre contrôleur de vue.

Dans le cas où la séquence a été initiée par une action sur un élément d'interface utilisateur, l'expéditeur sera alors cet élément d'interface utilisateur (c'est-à-dire s'il s'agit d'une connexion d'action sur une UIButton, alors la sender sera l'instance UIButton.

Si la séquence est initiée par votre code appelant performSegueWithIdentifier:sender:, la sender sera alors l'objet que vous avez transmis en tant que sender. Cela pourrait être votre contrôleur de vue, un bouton, un tableau, n'importe quoi. Donc oui, si vous transmettez "Hello World" à performSegueWithIdentifier:sender: en tant que valeur sender, il s'agira alors de la sender dans prepareForSegue:sender:

En termes d'ordre des opérations:

  1. performSegueWithIdentifier:sender est appelé, soit par votre code, soit à la suite d'une action sur un élément de l'interface utilisateur.
  2. Si votre contrôleur de vue implémente shouldPerformSegueWithIdentifier:sender:, cette fonction est appelée. Si cette fonction renvoie false, la transition est annulée.
  3. L'objet Segue et l'objet Contrôleur de vue de destination sont créés.
  4. Si votre contrôleur de vue implémente prepareForSegue:sender:, cette fonction est appelée.
  5. Une fois que prepareForSegue:sender: est revenu, la séquence est terminée.
21
Paulw11

La méthode performSegue appelle une séquence à exécuter d'une vue à une autre. Avant que la transition ait lieu, la méthode prepareForSegue est appelée et si vous souhaitez transmettre des données entre les vues, vous le feriez à cet endroit. 

La méthode performSegue ne prend pas le paramètre que vous voulez envoyer. Il est seulement utilisé pour appeler la segue en premier lieu. Toutes les données que vous souhaitez envoyer se feront via prepareForSegue. 

Voici un exemple. 

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    performSegueWithIdentifier("test", sender: self)
    //You can set the identifier in the storyboard, by clicking on the segue
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "test"{
        var vc = segue.destinationViewController as! RandomViewController
        vc.data = "Data you want to pass"
        //Data has to be a variable name in your RandomViewController
    }
}

Faites-moi savoir si cela aide!

20
The_Curry_Man

La réponse de The_Curry_Man a fonctionné pour moi. Voici une mise à jour de son code pour Swift 3.

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    performSegue(withIdentifier: "test", sender: self)
    //You can set the identifier in the storyboard, by clicking on the segue
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "test"{
        var vc = segue.destinationViewController as! RandomViewController
        vc.data = "Data you want to pass"
        //Data has to be a variable name in your RandomViewController
    }
}
5
Zion Perez

mes deux cents pour les débutants ... Dans Swift 3, c'est:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

}

Donc, si le contrôleur arrivé (de la classe MyController) implémente une méthode "fillData":

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if let destController = segue.destination as MyController{

        destController.fillData(...)
    }

}
2
ingconti