我有一个带有附加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的“正确”方法?
答案 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的信息。