2017-09-28 12 views
-1

Dans une séquence typique dans iOS, le contrôleur de vue A est en cours de numérotation à B, et je remplace prepare(for:sender:) dans A, pour transmettre des données à B.Dans la préparation de segue, comment transmettre des données à un enfant UIViewController?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    let b = segue.destination as! ViewControllerB 
    b.someData = ... 

Mais si B a un contrôleur de vue de l'enfant intégré, il ne sera pas encore chargé à ce moment. Existe-t-il une méthode recommandée pour transmettre des données au contrôleur de vue enfant intégré?

Je pourrais définir les champs sur ViewControllerB, puis les passer à l'enfant dans sa méthode viewDidLoad. (À ce stade, le contrôleur de vue enfant est présent dans le tableau childViewControllers de B). Mais, cela me semble un peu moche.

+0

Qu'en est-communication directe entre les petits-enfants et les grands-parents avec un délégué? – the4kman

+0

Eh bien, si vous avez A-> B-> C, et que vous avez besoin de transmettre des données de A-> C, vous pouvez régler ceci à B, et à l'intérieur B faites de même pour mettre à C. –

Répondre

0

Pour suivre les principes de la POO, en particulier "Abstraction". ViewControllerA ne devrait rien savoir de la façon dont ViewControllerB fait le travail. Si ViewControllerB charge les contrôles seuls, c'est l'activité de ViewControllerB. Le travail de ViewControllerA est de fournir ViewControllerB avec tout ce dont il a besoin pour faire le travail. Alors oui, j'utiliserais l'événement viewDidLoad pour charger le childViewController.

0

Vous pourriez avoir une méthode en mode commande B, par exemple

public configureChildVC(data: Any) { 
// in here set data to child vc 
} 

puis à se préparer à Segue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    let b = segue.destination as! ViewControllerB 
    b.configureChildVC(data: whatever) 
}