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

У меня есть 3 ViewController: ViewController A и ViewController B, а также контроллер C, который на самом деле является ContainerView, состоящим из двух UIView.

Моя раскадровка

Как вы можете видеть на приведенном выше рисунке, ViewController C имеет четкий фон, так что «тестовая метка» может быть видна в UIViews обоих ViewController A и B.

Когда я прокручиваю от ViewController A, чтобы перейти к ViewController B, я хочу иметь возможность выполнять некоторую анимацию (исчезновение/исчезновение, перевод, изменение текста и т.д.). Допустим, я хочу изменить текст с «Тестовая метка» на «Некоторый новый текст», проблема в том, что как только я попаду в ViewController B, я получаю сообщение «Неожиданно найдено nil при распаковке необязательного значения». ошибка.

Почему я получаю ноль и как правильно изменить текст метки?

Этот код кажется логичным, но я не могу понять его правильно:

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?


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

Правильно, вы должны использовать переопределение подготовки (для перехода:..) в исходном контроллере представления, ему будет передан экземпляр 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