我似乎误解了关于SWIFT/SWIFT用户界面的一些基本问题,因为我很难理解下面的最小示例在引入额外的视图或额外的间接级别时发生了什么。
下面是一个由ObservableObject
层次结构组成的简单模型,以及一些操作它的简单视图。
import SwiftUI
class Model : ObservableObject {
@Published var sub = SubModel()
}
class SubModel: ObservableObject {
@Published var hue: Double = 0.0
}
struct PickerView: View {
@Binding var hue: Double
var body: some View {
Slider(value: $hue, in: 0...255)
}
}
struct TextView: View {
@ObservedObject var model: Model
var body: some View {
Text(verbatim: String(model.sub.hue))
}
}
struct PickerWrapperView: View {
@ObservedObject var sub: SubModel
var body: some View {
PickerView(hue: $sub.hue)
}
}
struct ContentView: View {
@ObservedObject var model: Model
var body: some View {
VStack {
//PickerWrapperView(sub: model.sub)
PickerView(hue: $model.sub.hue)
TextView(model: model)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView(model: Model())
}
}
现在,正如预期的那样,这可以正常工作:当移动滑块时,文本将更新为新值。
但是:
- 将
PickerView
的直接使用替换为PickerViewWrapper
打破了数据绑定:文本不再更新 - 将
PickerViewWrapper
更改为引用将Model的示例作为输入(而不是使用子模型的示例)可以修复问题(但在我的实际场景中,这是不可能的,因为我确实希望引用顶级模型类的属性的属性)。
我在这里漏掉了什么简单的概念?
1条答案
按热度按时间bvjxkvbb1#
尝试这种方法,使用
struct SubModel
而不是嵌套ObservableObject。使用这种方法,SubModel
的任何变化都将被Model
直接观察到,即使使用中间视图也是如此。