我需要知道当 UI 中的
Binding
或 Bindable
var 更新时对模型进行自定义更改的正确方法是什么。具体来说,这是我的问题。我的视图模型如下:
enum ChosenControl {
case none, option1, option2, option3
}
@Observable class CustomViewModel {
var sliderVal:Float = 0.5
var sliderMinVal:Float = 0.0
var sliderMaxVal:Float = 1.0
var chosenControl:ChosenControl = .none
func chooseControl(_ controlOpt:ChosenControl) {
sliderMinVal = getMinValForOpt(controlOpt)
sliderVal = getCurrentValForOpt(controlOpt)
sliderMaxVal = getMaxValForOpt(controlOpt)
}
}
我现在从 ViewModel 中的这三个变量创建
@Bindable
并将其挂接到我的 SwiftUI 视图中的滑块。
Slider(value: $customViewModel.sliderVal) { editing in
print("Editing...")
}
我的问题是,当 UI 中的
sliderVal
更改时,我还想在模型中执行自定义操作(否则,当用户通过 UI 更改 sliderVal
时,可以以编程方式更改 sliderMinVal
、sliderMaxVal
、chosenControl
) 。正确的做法是什么?
您可以定义类似拦截器的属性:
let sliderValInterceptor = Binding<Float>(
get: { customViewModel.sliderVal },
set: {
customViewModel.sliderVal = $0
/* 👉 Do the extra work here 👈 */
}
)
然后在需要的地方使用它:
Slider(value: sliderValInterceptor) { editing in
print("")
}
因此设置
sliderValInterceptor
将会产生原始绑定没有的额外效果。