использование didSet для передачи значения в представление контейнера

#ios #swift #xcode #uiviewcontroller #uicontainerview

#iOS #swift #xcode #uiviewcontroller #uicontainerview

Вопрос:

Я могу успешно использовать didSet на главном UIViewController, и он выводит значение.

 var viewModel: ViewModel {
    didSet {
       label.text = viewModel.getData()
       print(viewModel.getData())
    }
}
  

Этот код работает, я могу восстановить данные, поэтому проблем с извлечением данных нет.

Проблема заключается в передаче этих данных в пользовательский интерфейс контейнера, который встроен в мой основной UIViewController. Я только что использовал IBOutlet childLabel в ViewController моего контейнера, и я хотел напечатать значение, которое печатается в моем основном UIView, в мой пользовательский интерфейс контейнера. Я объявил свой контейнер UIViewController в моем основном UIViewController как var VC: DetailViewController?

Я использовал этот код, он печатает значение, но не отображается в симуляторе. Я хочу знать, в чем моя ошибка: (

 var viewModel: ViewModel {
    didSet {
         if let dvc = VC {
            dvc.childLabel.text = viewModel.getData()
         }
     print(viewModel.getData())
    }
}
  

Ответ №1:

Во-первых, используйте лучшие (более описательные) имена переменных — это избавит вас от многих головных болей в будущем:

 // bad!
var VC: DetailViewController?

// better
var detailVC: DetailViewController?
  

Во-вторых, вы объявляете этот параметр необязательным (используя «?»). Если вы установите точку останова в своем коде и выполните пошаговое выполнение, вы увидите, что эта строка:

 if let dvc = VC {
  

будет равно false, и следующая строка не будет выполнена.

Вам необходимо назначить Container ViewController этой переменной. При использовании UIContainerView в раскадровке автоматически создается переход «встраивание». Итак, вы можете получить ссылку на этот контроллер в prepare for segue:

 class MainViewController: UIViewController {

    // to hold a reference to the Container View embedded controller   
    var detailVC: DetailViewController?

    var viewModel: ViewModel {
        didSet {
            // unwrap the optional
            if let dvc = self.detailVC {
                print("we have a valid reference to Detail View Controller")
                dvc.childLabel.text = viewModel.getData()
            }
            print(viewModel.getData())
        }
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destVC = segue.destination as? DetailViewController {
            self.detailVC = destVC
        }
    }

    // ... the rest of your view controller code...
}
  

Комментарии:

1. Спасибо, теперь это работает! Спасибо и за советы! Эта часть сводила меня с ума, ха-ха, теперь мой разум спокоен: D