SwiftUI查看属性willSet和didSet属性观察器不起作用

时间:2019-08-13 20:39:29

标签: swift mvvm viewmodel swiftui didset

我有一个带有附加ViewModel的SwiftUI(测试版5)视图。我想通过navigationLink导航到它并传递一个简单的参数(在本例中为FSAC)

我使用

导航
NavigationLink("Next", destination: MyTestView(FSAC: "testFsac"))

该视图具有一个带有willSet和didSet属性观察器的FSAC属性

struct MyTestView: View {
    @ObservedObject var vm = MyTestViewModel()

var FSAC: String {
    willSet {
        print("will set fsac")
    }
    didSet {
        print("did set fsac")
        vm.FSAC = FSAC
    }
}

var body: some View {
    VStack {
        Text("FSAC: \(FSAC)")
        Text("VM FSAC: \(vm.FSAC)")
    }
}

}

从不调用print语句。第一个文本框正确显示参数。第二个是空白。

我如何触发财产观察员?

更一般地说,是否存在使用NavigationLink将参数传递给具有ViewModel的View的“正确”方法?

3 个答案:

答案 0 :(得分:3)

基本var的属性观察员在技术上在SwiftUI中工作。如果您先执行var view = MyTestView(...)之类的操作,然后再执行view.FSAC = "updated",则观察者将触发(我已验证了这一点)。

但是,通常使用SwiftUI,您在每次布局遍历期间在View内{em> construct body(这是一个 struct 不是一个类)。就您而言,var body: some View { MyTestView(FSAC: "FSAC Value") }

属性观察器在初始化期间不会触发,因此它们通常在SwiftUI View中没有用。

如果您要在初始化期间更新某种状态,请查看this answer

答案 1 :(得分:0)

感谢arsenius解释为何财产观察员在这种情况下没有触发。

作为修复,我删除了视图中的属性,并用带有签名的init函数替换了该函数,该签名包括要从NavigationLink调用传递的必需数据。在初始化过程中,我直接在ViewModel上调用了一个函数。

struct MyTestView: View {

    @ObservedObject var vm = MyTestViewModel()

    init(FSAC: String) {
        if(FSAC != "") {
            vm.SetFsac(FSAC: FSAC)
        }
    }
...

答案 2 :(得分:0)

也设法解决了我的问题,我在视图中有一个切换开关,没有被触发。将绑定变量移动到切换到我的(视图)模型的观察对象,并从此处公开发布的属性。使用Andy和arsenius的信息。