在下面的代码(项目中某些代码的精简版本)中,我使用了具有两个视图的 MVVM 模式:
- ViewA - 显示存储在 ObservableObject ViewModel 中的值;
- ViewB - 显示相同的值并具有一个更改该值的 Slider,该值使用 Binding 传递给视图。
在 ViewModelA 内部,我有一个计算属性,它既可以避免视图直接访问模型,也可以在模型(正在显示的那个)内部的值发生更改时执行一些其他操作。
我还使用 Binding 将该计算值传递给 ViewModelB,它充当 ViewB 的 StateObject。但是,当拖动 Slider 以更改该值时,ViewA 上的值会更改,但在 ViewB 上不会更改,并且滑块本身不会滑动。正如预期的那样,在调试时,Binding 中的 WrappedValue 没有改变。
但是变化是如何向上传播的(通过绑定的设置器,我想)而不是向下传播回 ViewB?
我想只有当变量在某处被复制并且仅在一个地方更改时才会发生这种情况,但我似乎无法理解在哪里或如果那是实际发生的事情。
提前致谢!
意见:
import SwiftUI
struct ContentView: View {
@StateObject var viewModelA = ViewModelA()
var body: some View {
VStack{
ViewA(value: viewModelA.value)
ViewB(value: $viewModelA.value)
}
}
}
struct ViewA: View {
let value: Double
var body: some View {
Text("\(value)").padding()
}
}
struct ViewB: View {
@StateObject var viewModelB: ViewModelB
init(value: Binding<Double>){
_viewModelB = StateObject(wrappedValue: ViewModelB(value: value))
}
var body: some View {
VStack{
Text("\(viewModelB.value)")
Slider(value: $viewModelB.value, in: 0...1)
}
}
}
视图模型:
class ViewModelA: ObservableObject {
@Published var model = Model()
var value: Double {
get {
model.value
}
set {
model.value = newValue
// perform other checks and operations
}
}
}
class ViewModelB: ObservableObject {
@Binding var value: Double
init(value: Binding<Double>){
self._value = value
}
}
模型:
struct Model {
var value: Double = 0
}