Swift 4 Kuinka siirtää tietoja ViewControllers- ja ContainerViews-tilojen välillä?

Minulla on 3 ViewControlleria: ViewController A ja ViewController B ja Controller C, joka on itse asiassa ContainerView, joka koostuu kahdesta UIView:sta

Oma kuvakäsikirjoitus

Kuten yllä olevasta kuvasta näet, ViewController C:llä on selkeä tausta, joten "Test Label" näkyy sekä ViewController A:n että B:n käyttöliittymässä.

Kun pyyhkäisen ylöspäin ViewControllerista A siirtyäkseni ViewController B:hen, haluan pystyä suorittamaan animaatioita (häivytys sisään/ulos, kääntää, muuttaa tekstiä jne.). Oletetaan, että haluan muuttaa tekstin "Testitarrasta" tekstiksi "Uusi teksti". Ongelmana on, että heti kun pääsen ViewController B:hen, saan "Odottamatta löytyi nolla valinnaisen arvon avaamisen yhteydessä" -virheen.

Miksi saan nollan ja kuinka voin muuttaa tarran tekstiä oikein?

Tämä koodi näyttää järkevältä, mutta en saa sitä oikein:

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

Olen myös kokeillut:

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


        containerViewController.testLabel.text = "Some new text"

Onko minun lisättävä jotain ViewController A:n ohitustoimintoon?


person TNasty    schedule 05.06.2019    source lähde
comment
programmingios.net/dont-make-a-new-instance -vahingossa   -  person matt    schedule 05.06.2019


Vastaukset (2)


Voit antaa upotusjaksolle säiliöstä viewController C:lle tunnisteen, vaikkapa embedSegueFromBToC ja sitten nappaa varsinaisen ViewControllerin C, kun valmistaudut siirtoon pääohjaimessa, vaikkapa B.

Joten lisää B viewControlleriin tämä:

    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
Nousin sängystä kokeilla tätä.. kiitos paljon! Toimi täydellisesti! - person TNasty; 05.06.2019

Totta, sinun on käytettävä preparointia (for segue:..) alkuperäisessä näkymäohjaimessa, se välitetään ViewController B:n ilmentymä sekvenssi.kohde.

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

Katso lisätietoja tästä opetusohjelmasta: https://learnappmaking.com/pass-data-between-view-controllers-swift-how-to/

person ekscrypto    schedule 05.06.2019
comment
Ahh järkeä, tämä oli mitä minulla oli mielessäni, mutta sitten Hossamin vastaus selvensi kaiken. Kiitos avustasi! - person TNasty; 05.06.2019