SwiftUI @Binding 值无法更改并调用 init

标签 swift swiftui combine publisher

我想让一个选择器使用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/

相关文章:

ios - SwiftUI-带有可点击按钮的单元格(在Form内)

xcode - 如何在 SwiftUI 中限制 FetchRequest 中的结果数量

ios - SF Symbols 在 iOS 15 WidgetKit 中失去了颜色

ios - Swift 结合错误 : method on 'Publisher' requires . Failure' (又名 'WeatherError' )和 'Never' 是等价的

swift - 在OperationQueue中打印1到10不打印整数

ios - iOS 12 中的自定义导航标题

ios - 将文本段落(包括换行符)存储在云包中并查询

Swift 联合发布两次

ios - 如果缺少字段,则解析注册到下一个 View Controller

ios - 你如何调试 Swift PlaygroundBook?