13

我有一个带有附加 ViewModel 的 SwiftUI (Beta 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)")
    }
}

}

打印语句永远不会被调用。第一个文本框正确显示参数;第二个是空白的。

我怎样才能让 Property Observers 开火?

更一般地说,是否有一种“正确”的方式来使用 navigationLink 将参数传递给具有 ViewModel 的 View?

4

3 回答 3

25

编辑:在 iOS 14 上,属性观察器的工作方式与它们在 iOS 13 中的工作方式相同。但是,我们现在有了.onChange(of:perform:)替代品。文档

Text(self.myString).onChange(of: self.myString) { newValue in print("myString changed to: \(newValue)") }

varbasic 上的属性观察器在技术上可以在 SwiftUI 中工作。如果你做了类似的事情var view = MyTestView(...),那么view.FSAC = "updated"观察者就会开火(我已经证实了这一点)。

但是,通常使用 SwiftUI,您在每个布局传递期间构造View(这是一个结构而不是类) 。body在你的情况下var body: some View { MyTestView(FSAC: "FSAC Value") }

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

如果您想在初始化期间更新某种状态,请查看此答案

于 2019-08-13T23:19:56.087 回答
3

感谢 arsenius 解释了为什么 Property Observers 在这种情况下没有开火。

作为修复,我删除了视图中的属性,并将其替换为带有签名的 init 函数,其中包含要从 NavigationLink 调用传递的所需数据。在 init 中,我直接在 ViewModel 上调用了一个函数。

struct MyTestView: View {

    @ObservedObject var vm = MyTestViewModel()

    init(FSAC: String) {
        if(FSAC != "") {
            vm.SetFsac(FSAC: FSAC)
        }
    }
...
于 2019-08-14T14:41:37.347 回答
0

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

于 2020-03-01T20:26:13.493 回答