Swift 4 Cum se transferă date între ViewControllers și ContainerViews?

Am 3 ViewControllers: ViewController A și ViewController B și Controller C, care este de fapt un ContainerView format din două UIViews

Storyboardul meu

După cum puteți vedea în imaginea de mai sus, ViewController C are un fundal clar, astfel încât „Eticheta de testare” poate fi văzută în UIView-urile atât ale ViewController A cât și ale B.

Când glis în sus din ViewController A pentru a merge la ViewController B, vreau să pot realiza o animație (fade in/out, traduce, schimb text etc..). Să presupunem că vreau să schimb textul pentru de la „Etichetă de testare” la „Un text nou”, problema este că de îndată ce intru în ViewController B, primesc eroarea „Găsit neașteptat la zero la despachetarea unei valori opționale”.

De ce primesc zero și cum pot schimba corect textul etichetei?

Acest cod pare să aibă sens, dar nu îl pot înțelege corect:

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

am incercat si eu:

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


        containerViewController.testLabel.text = "Some new text"

Trebuie să adaug ceva în funcția de înlocuire a ViewController A?


person TNasty    schedule 05.06.2019    source sursă
comment
programmingios.net/dont-make-a-new-instance -din greșeală   -  person matt    schedule 05.06.2019


Răspunsuri (2)


Puteți da secvenței de încorporare din container la viewController C un identificator, să spunem embedSegueFromBToC, apoi să prindeți ViewController-ul real C în pregătirea pentru segue în controlerul părinte, să spunem B.

Deci, în B viewController adăugați asta:

    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
M-am ridicat din pat pentru a încerca asta.. mulțumesc mult! A funcționat perfect! - person TNasty; 05.06.2019

Corect, trebuie să utilizați suprascrierea pregăti (pentru segue:..) în controlerul de vizualizare de origine, i se va trece instanța ViewController B ca segue.destination.

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

Consultați acest tutorial pentru mai multe informații: https://learnappmaking.com/pass-data-between-view-controllers-swift-how-to/

person ekscrypto    schedule 05.06.2019
comment
Ahh are sens, asta era ceea ce am avut în minte, dar apoi răspunsul lui Hossam a clarificat totul. Vă mulţumesc pentru ajutor! - person TNasty; 05.06.2019