使用 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...
}