web-dev-qa-db-fra.com

Comment transmettre des données de ViewController à une vue conteneur?

J'ai un storyboard installé dans XCode et un MainViewController. Dans le MainViewController, j'ai ajouté un ContainerView qui crée naturellement un Segue avec un autre VIewController.

Dans mon fichier MainViewController.m, j'ai configuré les données et je souhaite les lier à une étiquette du conteneur. Cependant, je pensais pouvoir cliquer sur le propriétaire du fichier et le faire, mais bien sûr, je ne peux pas, car il s'agit de 2 contrôleurs de vue différents maintenant. .

Quelqu'un peut-il m'aider s'il vous plaît parce que je me bats avec cela. Il doit y avoir un moyen facile mais je ne peux pas le casser!

Je vous remercie

21
Omar

Vous pouvez utiliser prepareForSegue comme n'importe quel autre contrôleur - cette méthode sera appelée une fois les deux contrôleurs instanciés, mais avant que viewDidLoad ne soit exécuté. Pour ce faire, utilisez la propriété childViewControllers du contrôleur parent (le contrôleur intégré est un enfant). Ainsi, l'enfant sera self.childViewControllers [0].

Après édition:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"EmbedSegue"]) {
        MyEmbeddedController *embed = segue.destinationViewController;
        embed.labelString = self.stringToPass;
    }
}

Bien sûr, vous devez changer les noms en ce que vous avez. Assurez-vous que le nom que vous donnez à la division dans IB correspond à celui que vous recherchez dans l'instruction if. Dans cet exemple, labelString est une propriété de chaîne que vous avez configurée dans votre contrôleur intégré. Ensuite, dans la méthode viewDidLoad de ce contrôleur, vous pouvez définir la valeur de l'étiquette avec cette chaîne.

27
rdelmar

C’est à peu près la même réponse que celle de one de rdelmar seulement dans Swift.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let embeddedVC = segue.destinationViewController as? MyEmbeddedController where segue.identifier == "EmbedSegue" {
        embeddedVC.labelString = self.stringToPass
    }
}

"EmbedSegue" correspond à l'identificateur de segment que vous avez défini dans Interface Builder.

5
orkoden
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Make sure your segue name in storyboard is the same as this line
    if ([[segue identifier] isEqualToString:@"YOUR_SEGUE_NAME_HERE"])
    {
        // Get reference to the destination view controller
        YourViewController *vc = [segue destinationViewController];

        // Pass any objects to the view controller here, like...
        [vc setMyObjectHere:object];
    }
}

Je devrais également mentionner que, du fait que vous utilisez une vue Conteneur, prepareForSegue sera déclenché lorsque vous présenterez la ViewController qui contient le conteneur. 

0
Segev

Réponse pour Swift 4:

if let controller = segue.destinationController as? MyEmbeddedController, segue.identifier!.rawValue == "EmbedSegue" {
    controller.labelString = self.stringToPass
}
0
David Boyd