gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:40:49 26 4
gpt4 key购买 nike

我有一个带有附加 ViewModel 的 SwiftUI (Beta 5) View 。我想通过 navigationLink 导航到它并传入一个简单的参数(在本例中称为 FSAC)

我使用导航

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

该 View 具有带有 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 ?

最佳答案

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

Text(self.myString).onChange(of: self.myString) { newValue in print("myString changed to: \(newValue)") }
<小时/>

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

但是,通常使用 SwiftUI,您可以在 body构造 View(这是一个结构,而不是类) > 在每次布局过程中。在您的情况下 var body: some View { MyTestView(FSAC: "FSAC Value") }.

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

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

关于SwiftUI View 属性 willSet 和 didSet 属性观察器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57485024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com