SwiftUI-ObservableObject中的绑定



假设我们有一个父视图,如:

struct ParentView: View {
@State var text: String = ""
var body: some View {
ChildView(text: $text)
}
}

儿童视图,如:

struct ChildView: View {
@ObservedObject var childViewModel: ChildViewModel
init(text: Binding<String>) {
self.childViewModel = ChildViewModel(text: text)
}
var body: some View {
...
}
}

以及子视图的视图模型:

class ChildViewModel: ObservableObject {
@Published var value = false
@Binding var text: String
init(text: Binding<String>) {
self._text = text
}
...
}

对子视图模型内的String绑定进行更改会使ChildView重新绘制,从而导致viewModel重新创建自己,从而将@Published参数重置为默认值。在你看来,处理这个问题的最佳方法是什么?

干杯!

最好的方法是使用自定义结构作为真理的单一来源,并将绑定传递到子视图中,例如

struct ChildViewConfig {
var value = false
var text: String = ""
// mutating funcs for logic

mutating func reset() {
text = ""
}
}
struct ParentView: View {
@State var config = ChildViewConfig()
var body: some View {
ChildView(config: $config)
}
}
struct ChildView: View {
@Binding var config: ChildViewConfig
var body: some View {
TextField("Text", text: $config.text)
...
Button("Reset") {
config.reset()
}
}
}

"CCD_ 1可以保持其性质的不变量,并且可以独立测试。因为ViewConfig是一种值类型,所以对ViewConfig的属性的任何更改,就像它的文本一样,都可视为对ViewConfig本身的更改"【SwiftUI WWDC 2020中的Data Essentials】。

相关内容

  • 没有找到相关文章

最新更新