假设我们有一个父视图,如:
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】。