#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