2015-04-16 4 views
3

Je suis nouveau dans le développement iOS et je suis coincé avec un problème. Voici mon application. Ce que j'essaye de réaliser est quand je clique sur le commutateur, il devrait mettre à jour les probabilités de tableView.Communication entre les contrôleurs de vue conteneur

Voici mon story-board: storyboard

Je suis en mesure d'obtenir la valeur modifiée du commutateur dans le DetailViewController (le contrôleur à gauche, l'ancêtre) avec un protocole de délégué. Mais maintenant je n'ai aucune idée sur la façon de diffuser la nouvelle valeur à DetailChartViewController. Le DetailChartViewController est un UIPageViewController contenant UITableViewControllers (comme vu dans la capture d'écran). Alors, comment puis-je diffuser une nouvelle valeur de l'enfant au parent à l'enfant? Dois-je utiliser un modèle d'observateur? Le centre de notification?

Toute suggestion vous sera utile.

+0

Jetez un oeil à ce pour savoir comment obtenir une référence à votre contrôleur de vue contenu: http://stackoverflow.com/questions/29582200/how-do-i-get-the-views-inside-a -container-in-swift/29582305 # 29582305 – ABakerSmith

Répondre

4

Créez un var pour votre detailChartViewController, puis définissez-le directement. Vous pouvez assigner le var dans votre méthode prepareForSegue. Lorsque vous créez une vue de conteneur, vous devez définir son identifiant pour le contrôleur intégré. Ensuite, votre méthode prepareForSegue se déclenchera, c'est là que vous assignerez cette variable au contrôleur. Si vous voulez accéder à votre parent depuis les enfants, vous pouvez passer une référence à votre parent depuis la fonction prepareForSegue ou créer un protocole/délégué pour communiquer (généralement préféré).

var detailFormViewController:DetailFormViewController? // Set the identifier for both of these in the identity inspector of these views in the storyboard 
var detailViewController:DetailViewController? 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "DetailView" { 
     self.detailViewController = segue.destinationViewController as! DetailViewController 
     // You can always pass the parent to the child like below although a delegate is a more preferred technique 
     self.detailViewController.parentViewController = self 
    } else if segue.identifier == "DetailFormViewController" { 
     self.detailFormViewController = segue.destinationViewController as! DetailFormViewController 
    } 
} 

func someFunction() { 
    // Now that you have a reference to your container view controllers you can access any of their objects directly from your parent view. 
    self.detailViewController.labelSomething.text = "Something" 
    self.detailFormViewController.labelSomethingElse.text = "Something else". 
} 
+0

Eh bien, je l'ai fait, mais je ne comprends pas comment cela peut fonctionner. Parce que mon DetailViewFormController propage l'événement à son parent, mais comment diffuser et mettre à jour la vue des autres enfants? Si j'ai raison, la fonction prepareForSegue est appelée sur la création de la vue parente, appelée une seule fois. – prbaron

+0

Je vais mettre à jour ma réponse avec une explication plus détaillée. –

+0

Ne serait-il pas logique d'utiliser des délégués au lieu de définir des références directes? Aussi devrions-nous envisager d'utiliser des références faibles puisqu'elles auront des dépendances circulaires ou seront-elles traitées? – Warpzit