Swift 4 Comment transmettre des données entre ViewControllers et ContainerViews ?

J'ai 3 ViewControllers : ViewController A et ViewController B, et Controller C qui est en fait un ContainerView composé de deux UIViews.

Mon Storyboard

Comme vous pouvez le voir dans l'image ci-dessus, ViewController C a un arrière-plan clair tel que "l'étiquette de test" peut être vue dans les UIViews des ViewController A et B.

Lorsque je fais glisser mon doigt depuis ViewController A pour accéder à ViewController B, je souhaite pouvoir effectuer une animation (fondu entrant/sortant, traduire, modifier le texte, etc.). Disons que je veux changer le texte de "Test Label" en "Un nouveau texte", le problème est que dès que j'entre dans ViewController B, j'obtiens l'erreur "Trouvé de manière inattendue nulle lors du déballage d'une valeur facultative".

Pourquoi est-ce que je reçois zéro et comment puis-je modifier correctement le texte de l'étiquette ?

Ce code semble logique mais je n'arrive pas à le comprendre :

let containerViewController = ContainerViewController()
        containerViewController.testLabel.text = "Some new text"

J'ai aussi essayé :

let containerViewController = storyboard?.instantiateViewController(withIdentifier: "containerViewController") as! containerViewController


        containerViewController.testLabel.text = "Some new text"

Dois-je ajouter quelque chose dans la préparation de la fonction de remplacement du ViewController A ?


person TNasty    schedule 05.06.2019    source source
comment
programmingios.net/dont-make-a-new-instance -par erreur   -  person matt    schedule 05.06.2019


Réponses (2)


Vous pouvez donner à la séquence d'intégration du conteneur au viewController C un identifiant, disons embedSegueFromBToC, puis attraper le ViewController C réel lors de la préparation de la séquence dans le contrôleur parent, disons B.

Donc, dans B viewController, ajoutez ceci :

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "embedSegueFromBToC" {
            if let viewControllerC =  segue.destination as? ViewControllerC {
                viewContrllerC.loadViewIfNeeded() // you might need this since the need to access the testLabel which a UI component that need to be loaded
                viewControllerC.testLabel.text = "Some new text"
            }
        }
    }
person Hossam Sherif    schedule 05.06.2019
comment
Je me suis levé du lit pour essayer ça... merci beaucoup ! A parfaitement fonctionné ! - person TNasty; 05.06.2019

Correct, vous devez utiliser le remplacement prepare(for segue:..) dans votre contrôleur de vue d'origine, l'instance de ViewController B lui sera transmise en tant que segue.destination.

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
    if let viewControllerB = segue.destination as? ViewControllerB
    {
        viewControllerB.testLabel.text = "Some new text"
    }
}

Consultez ce didacticiel pour plus d'informations : https://learnappmaking.com/pass-data-between-view-controllers-swift-how-to/

person ekscrypto    schedule 05.06.2019
comment
Ahh, c'est logique, c'est un peu ce que j'avais en tête, mais la réponse de Hossam a tout clarifié. Merci pour votre aide! - person TNasty; 05.06.2019