Swift 4 Как передавать данные между ViewControllers и ContainerViews? - PullRequest
0 голосов
/ 05 июня 2019

У меня есть 3 ViewControllers: ViewController A и ViewController B, и Controller C, который на самом деле представляет собой ContainerView, состоящий из двух UIViews

My Storyboard

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

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

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

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

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

Iтакже пытались:

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


        containerViewController.testLabel.text = "Some new text"

Нужно ли что-то добавить в функцию переопределения функции ViewController A?

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Вы можете передать последовательность внедрения из контейнера в 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"
            }
        }
    }
0 голосов
/ 05 июня 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/

...