Swift 4 ViewControllers आणि ContainerViews मधील डेटा कसा पास करायचा?

माझ्याकडे 3 ViewControllers आहेत: ViewController A आणि ViewController B, आणि Controller C जे प्रत्यक्षात दोन UIViews असलेले कंटेनर व्ह्यू आहे

जसे तुम्ही वरील चित्रात पाहू शकता, ViewController C ची स्पष्ट पार्श्वभूमी आहे जसे की "Test Label" ViewController A आणि B दोन्हीच्या UIViews मध्ये दिसू शकते.

जेव्हा मी व्ह्यूकंट्रोलर बी वर जाण्यासाठी व्ह्यूकंट्रोलर ए वरून स्वाइप करतो, तेव्हा मला काही अॅनिमेशन (फेड इन/आउट, भाषांतर, मजकूर बदलणे इ..) करण्यास सक्षम व्हायचे आहे. समजा मला "चाचणी लेबल" वरून "काही नवीन मजकूर" साठी मजकूर बदलायचा आहे, समस्या अशी आहे की मी ViewController B मध्ये प्रवेश केल्यावर, मला "वैकल्पिक मूल्य अनरॅप करताना अनपेक्षितपणे आढळले शून्य" त्रुटी येते.

मला शून्य का मिळत आहे आणि मी लेबल मजकूर योग्यरित्या कसा बदलू शकतो?

हा कोड अर्थपूर्ण आहे असे दिसते परंतु मला ते बरोबर समजू शकत नाही:

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

मी देखील प्रयत्न केला आहे:

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


        containerViewController.testLabel.text = "Some new text"

मला ViewController A च्या override func ready मध्ये काही जोडावे लागेल का?


person TNasty    schedule 05.06.2019    source स्रोत
comment
programmingios.net/dont-make-a-new-instance -चुकून   -  person matt    schedule 05.06.2019


उत्तरे (2)


तुम्ही कंटेनरमधून व्ह्यूकंट्रोलर सी ला एम्बेड सेग्यू देऊ शकता एक आयडेंटिफायर सांगू द्या embedSegueFromBToC नंतर वास्तविक व्ह्यूकंट्रोलर पकडा C पॅरेंट कंट्रोलर लेट B मध्ये सेग्यूसाठी तयार करा.

तर B viewController मध्ये हे जोडा:

    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
हे करून पाहण्यासाठी अंथरुणातून बाहेर पडलो.. खूप खूप धन्यवाद! उत्तम प्रकारे काम केले! - person TNasty; 05.06.2019

बरोबर, तुम्हाला तुमच्या मूळ व्ह्यू कंट्रोलरमध्ये (segue साठी:..) ओव्हरराइड वापरावे लागेल, ते segue.destination म्हणून ViewController B चे उदाहरण पास केले जाईल.

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

अधिक माहितीसाठी हे ट्यूटोरियल पहा: https://learnappmaking.com/pass-data-between-view-controllers-swift-how-to/

person ekscrypto    schedule 05.06.2019
comment
अहह अर्थ आहे, माझ्या मनात जे होते तेच हेच आहे पण नंतर होसमच्या उत्तराने सर्व काही स्पष्ट झाले. तुमच्या मदतीबद्दल धन्यवाद! - person TNasty; 05.06.2019