我想让一个选择器使用SwiftUI,当我改变ChildView中的值时,它不会改变并调用ChildView init。
class ViewModel: ObservableObject {
@Published var value: Int
init(v: Int) {
self.value = v
}
}
struct ChildView: View {
@Binding var value: Int
@ObservedObject var vm = ViewModel(v: 0)
init(value: Binding<Int>) {
self._value = value
print("ChildView init")
}
var body: some View {
VStack {
Text("param value: \(value)")
Text("@ObservedObject bar: \(vm.value)")
Button("(child) bar.value++") {
self.vm.value += 1
}
}
.onReceive(vm.$value) { value = $0 }
}
}
struct ContentView: View {
@State var value = 0
var body: some View {
VStack {
Text("(parent) \(self.value)")
ChildView(value: $value)
}
}
}
但是当我在 ContentView 中删除 Text("(parent)\(self.value)")
时,它似乎很正常。
最佳答案
发生这种情况是因为只要 ChildView
获得 init
-ialized - 当 ContentView
的主体被重新计算时就会发生 - 它会创建一个新的实例ViewModel
的值为 0
。
首先确定谁“拥有”数据。如果它是一些外部对象,例如 ViewModel
,那么它应该在实例可以长期存在的地方实例化,例如在 ContentView
中(但这取决于您的实际情况)用例):
struct ContentView: View {
@State var value = 0
var childVm = ViewModel(v: 0)
var body: some View {
VStack {
Text("(parent) \(self.value)")
ChildView(vm: childVm, value: $value)
}
}
}
struct ChildView: View {
@Binding var value: Int
@ObservedObject var vm: ViewModel
init(vm: ViewModel, value: Binding<Int>) {
self._value = value
self.vm = vm
print("ChildView init")
}
// ...
}
关于SwiftUI @Binding 值无法更改并调用 init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63406177/