2016-06-14 1 views
5

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

Supposons qu'un clic sur un bouton appelle la méthode performSegue, cela appelle-t-il é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 "expéditeur" est-il lié dans les deux fonctions? Si je transmets une chaîne en tant qu'expéditeur dans la méthode performSegue, est-ce que cela sera transféré vers le paramètre de l'expéditeur dans la méthode prepareSegue? En d'autres termes, si je mets le paramètre sender dans la méthode performSegue en tant que "Hi world", le paramètre sender de la méthode prepareSegue sera-t-il également la même chaîne?

Merci

Répondre

16

Il y a, effectivement, deux façons dont vous pouvez déclencher un enchaînement. La première est via une action sur un élément d'interface utilisateur dans Interface Builder, la seconde utilise performSegueWithIdentifier:sender: dans votre code. Je dis « efficace », parce que sous les couvertures, lorsque la scène est chargé à partir du story-board, un gestionnaire d'action est configuré qui appelle finalement performSegueWithIdentifier:sender:

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

Dans le cas où l'enchaînement a été initié par une action sur un élément d'interface utilisateur puis l'expéditeur sera ce que l'élément d'interface utilisateur (à savoir si elle est une connexion à action sur un UIButton alors le sender sera l'instance UIButton).

Si la séquence est initiée par votre code appelant performSegueWithIdentifier:sender:, le sender sera l'objet que vous aurez passé comme sender. Cela pourrait être votre contrôleur de vue, un bouton, un tableau, n'importe quoi. Alors oui, si vous passez « Bonjour tout le monde » à performSegueWithIdentifier:sender: la valeur sender alors ce sera le sender dans prepareForSegue:sender:

En termes de l'ordre des opérations:

  1. performSegueWithIdentifier:sender est appelé, que ce soit par votre code ou à la suite d'une action sur un élément d'interface utilisateur
  2. Si votre contrôleur de vue implémente shouldPerformSegueWithIdentifier:sender:, cette fonction est appelée. Si cette fonction retourne alors la false Segue est annulé
  3. L'objet Segue et vue objet de destination contrôleur sont créés
  4. Si votre contrôleur de vue implémente prepareForSegue:sender: cette fonction est appelée.
  5. Une fois retourné prepareForSegue:sender:, le segue se termine.
+0

Merci pour cela, il m'a sauvé un petit retour en arrière - je devais savoir si prepareForSegue serait encore appelé indépendamment de vérifier la valeur de retour de shouldPerformSegue. – MandisaW

15

La méthode performSegue appelle une séquence à exécuter d'une vue à l'autre. Avant que le segue n'ait lieu, la méthode prepareForSegue est appelée, et si vous voulez passer des données entre les vues, vous le ferez.

La méthode performSegue ne prend pas le paramètre que vous voulez envoyer. C'est seulement utilisé pour appeler le segue en premier lieu. Toutes les données que vous souhaitez envoyer seront effectuées 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!

+0

Vous pouvez transmettre les données que vous souhaitez envoyer en tant que 'expéditeur' dans' performSegueWithIdentifier: sender: 'mais vous devrez le transférer au contrôleur de vue de destination dans' prepareForSegue: expéditeur: ' – Paulw11

2

mes deux cents pour les débutants ... En rapide 3 est:

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

} 

Ainsi, si le contrôleur arrivant (de MyController de classe) met en œuvre une méthode "fillData":

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

    if let destController = segue.destination as MyController{ 

     destController.fillData(...) 
    } 

} 
2

réponse de The_Curry_Man travaillé 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 
    } 
}