Swift 4 Как да предавам данни между ViewControllers и ContainerViews?

Имам 3 ViewControllers: ViewController A и ViewController B, и Controller C, който всъщност е ContainerView, състоящ се от два UIView

Моята сценария

Както можете да видите на снимката по-горе, ViewController C има ясен фон, така че „Тестовият етикет“ може да се види в UIViews както на ViewController A, така и на B.

Когато прекарам пръст нагоре от ViewController A, за да отида до ViewController B, искам да мога да изпълня някаква анимация (избледняване/изчезване, превод, промяна на текст и т.н.). Да речем, че искам да променя текста за от „Тестов етикет“ на „Някакъв нов текст“, проблемът е, че веднага щом вляза във 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"

Трябва ли да добавя нещо в подготовката на override func на ViewController A?


person TNasty    schedule 05.06.2019    source източник
comment
programmingios.net/dont-make-a-new-instance -погрешка   -  person matt    schedule 05.06.2019


Отговори (2)


Можете да дадете на вградения преход от контейнера към viewController C идентификатор, да речем embedSegueFromBToC, след което да хванете действителния ViewController 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:..) във вашия изходен контролер за изглед, ще бъде предадено екземплярът на ViewController B като segue.destination.

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