SwiftUI 视图模型处理状态更改

问题描述 投票:0回答:1

我需要知道当 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
) 。正确的做法是什么?

ios swift swiftui observable
1个回答
0
投票

您可以定义类似拦截器的属性:

let sliderValInterceptor = Binding<Float>(
    get: { customViewModel.sliderVal },
    set: {
        customViewModel.sliderVal = $0
        /* 👉 Do the extra work here 👈 */
    }
)

然后在需要的地方使用它:

Slider(value: sliderValInterceptor) { editing in
    print("")
}

因此设置

sliderValInterceptor
将会产生原始绑定没有的额外效果。

© www.soinside.com 2019 - 2024. All rights reserved.