使用 didSet 将值传递给容器视图
using didSet to pass value to container view
我可以在主 UI 上成功使用 didSetViewController 并打印值。
var viewModel: ViewModel {
didSet {
label.text = viewModel.getData()
print(viewModel.getData())
}
}
此代码有效,我可以检索数据,因此检索数据没有问题。
问题是将此数据传递到嵌入在我的主 UI 中的容器 UIViewViewController。我刚刚在我的容器 ViewController 中使用了一个 IBOutlet childLabel
并且我想打印在我的 main UIView 中打印的值到我的 容器 UIView。我已经在主 UIViewController 中将容器 UIViewController 声明为 var VC: DetailViewController?
我使用了这段代码,它打印了值但没有显示在模拟器上。我想知道我的错误是什么:(
var viewModel: ViewModel {
didSet {
if let dvc = VC {
dvc.childLabel.text = viewModel.getData()
}
print(viewModel.getData())
}
}
首先,使用更好的(更具描述性的)变量名——它会为您省去很多麻烦:
// bad!
var VC: DetailViewController?
// better
var detailVC: DetailViewController?
其次,您声明该 var 是可选的(通过使用“?”)。如果您在代码中设置断点并单步执行,您将看到这一行:
if let dvc = VC {
将为false,下一行不会执行。
您需要将容器 ViewController 分配给该变量。在情节提要中使用 UIContainerView
时,会自动创建“嵌入”转场。因此,您可以获得对该控制器的引用以准备转场:
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...
}
我可以在主 UI 上成功使用 didSetViewController 并打印值。
var viewModel: ViewModel {
didSet {
label.text = viewModel.getData()
print(viewModel.getData())
}
}
此代码有效,我可以检索数据,因此检索数据没有问题。
问题是将此数据传递到嵌入在我的主 UI 中的容器 UIViewViewController。我刚刚在我的容器 ViewController 中使用了一个 IBOutlet childLabel
并且我想打印在我的 main UIView 中打印的值到我的 容器 UIView。我已经在主 UIViewController 中将容器 UIViewController 声明为 var VC: DetailViewController?
我使用了这段代码,它打印了值但没有显示在模拟器上。我想知道我的错误是什么:(
var viewModel: ViewModel {
didSet {
if let dvc = VC {
dvc.childLabel.text = viewModel.getData()
}
print(viewModel.getData())
}
}
首先,使用更好的(更具描述性的)变量名——它会为您省去很多麻烦:
// bad!
var VC: DetailViewController?
// better
var detailVC: DetailViewController?
其次,您声明该 var 是可选的(通过使用“?”)。如果您在代码中设置断点并单步执行,您将看到这一行:
if let dvc = VC {
将为false,下一行不会执行。
您需要将容器 ViewController 分配给该变量。在情节提要中使用 UIContainerView
时,会自动创建“嵌入”转场。因此,您可以获得对该控制器的引用以准备转场:
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...
}