Swift 4 ViewControllers və ContainerViews arasında məlumatları necə ötürmək olar?

Məndə 3 ViewController var: ViewController A və ViewController B və əslində iki UIView-dən ibarət ContainerView olan Controller C

Mənim hekayə lövhəm

Yuxarıdakı şəkildə gördüyünüz kimi, ViewController C aydın fona malikdir ki, "Test Etiketi" həm ViewController A, həm də B-nin UIView-lərində görünə bilər.

ViewController B-ə keçmək üçün ViewController A-dan yuxarı sürüşdürdüyüm zaman bəzi animasiyaları yerinə yetirmək istəyirəm (sönmək/çıxmaq, tərcümə etmək, mətni dəyişmək və s..). Tutaq ki, mən mətni "Sınaq Etiketi"ndən "Bəzi yeni mətn"ə dəyişmək istəyirəm, problem ViewController B-ə daxil olan kimi "Könüllü dəyərin paketini açarkən gözlənilmədən sıfır tapıldı" xətası ilə qarşılaşıram.

Niyə sıfır alıram və etiket mətnini necə düzgün dəyişə bilərəm?

Bu kod məntiqli görünür, lakin mən onu düzgün başa düşə bilmirəm:

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

Mən də cəhd etmişəm:

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


        containerViewController.testLabel.text = "Some new text"

ViewController A-nın ləğv funksiyasını hazırlamağa nəsə əlavə etməliyəmmi?


person TNasty    schedule 05.06.2019    source mənbə
comment
programmingios.net/dont-make-a-new-instance -səhvlə   -  person matt    schedule 05.06.2019


Cavablar (2)


Siz identifikatoru konteynerdən viewController C-yə verə bilərsiniz, deyək ki, embedSegueFromBToC, sonra ana nəzarətçidə segue üçün hazırlıqda faktiki ViewController C-ni tutmaq, deyək ki, B.

Beləliklə, B viewController-də bunu əlavə edin:

    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
Bunu sınamaq üçün yataqdan qalxdım.. çox sağ olun! Mükəmməl işlədi! - person TNasty; 05.06.2019

Düzdür, mənşəli görünüş nəzarətçinizdə preparat(for segue:..) override istifadə etməlisiniz, o, segue.destination olaraq ViewController B nümunəsindən keçəcək.

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

Ətraflı məlumat üçün bu təlimatı yoxlayın: https://learnappmaking.com/pass-data-between-view-controllers-swift-how-to/

person ekscrypto    schedule 05.06.2019
comment
Ahh məntiqlidir, ağlıma gələn budur, amma sonra Hossamın cavabı hər şeyi aydınlaşdırdı. Yardımınız üçün təşəkkür edirik! - person TNasty; 05.06.2019