Swift 4 Si të kalojmë të dhëna midis ViewControllers dhe ContainerViews?

Unë kam 3 ViewControllers: ViewController A dhe ViewController B, dhe Controller C i cili në fakt është një ContainerView i përbërë nga dy UIView

My Storyboard

Siç mund ta shihni në foton e mësipërme, ViewController C ka një sfond të qartë të tillë që "Test Label" mund të shihet në UIViws të të dy ViewController A dhe B.

Kur rrëshqis lart nga ViewController A për të shkuar te ViewController B, dua të jem në gjendje të kryej disa animacione (zbehet/dalja, përkthe, ndrysho tekst etj.). Le të themi se dua të ndryshoj tekstin për nga "Etiketa e testimit" në "Disa tekst i ri", problemi është që sapo të futem në ViewController B, marr gabimin "U gjet papritur zero ndërsa zbërthehet një vlerë opsionale".

Pse po marr zero dhe si mund ta ndryshoj siç duhet tekstin e etiketës?

Ky kod duket se ka kuptim, por nuk mund ta kuptoj siç duhet:

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

Kam provuar gjithashtu:

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


        containerViewController.testLabel.text = "Some new text"

A duhet të shtoj diçka në përgatitjen e funksionit të zëvendësimit të ViewController A?


person TNasty    schedule 05.06.2019    source burimi
comment
programmingios.net/dont-make-a-new-instance -nga-gabim   -  person matt    schedule 05.06.2019


Përgjigjet (2)


Mund t'i jepni embed segue nga kontejneri te viewController C një identifikues le të themi embedSegueFromBToC pastaj kapni ViewController aktual C në përgatitjen për segue në kontrolluesin prind le të themi B.

Pra, në B viewController shtoni këtë:

    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
U ngrita nga shtrati për ta provuar këtë.. faleminderit shumë! Punoi perfekt! - person TNasty; 05.06.2019

Saktë, duhet të përdorni zëvendësimin përgatit (për segue:..) në kontrolluesin tuaj fillestar të pamjes, do t'i kalohet shembulli i ViewController B si segue.destination.

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

Shikoni këtë tutorial për më shumë informacion: https://learnappmaking.com/pass-data-between-view-controllers-swift-how-to/

person ekscrypto    schedule 05.06.2019
comment
Ahh ka kuptim, kjo ishte ajo që kisha në mendje, por më pas përgjigja e Hossamit sqaroi gjithçka. Faleminderit per ndihmen tuaj! - person TNasty; 05.06.2019