我有一个 init 结构体
@Binding var fieldValue:Float
init(fieldValue:Binding<Float>) {
self._fieldValue = fieldValue
}
在某些时候,我想更新 fieldValue
而不触发其他监听 $fieldValue
的点的更新。
这可能吗?
答案 0 :(得分:1)
问题是 SwiftUI 默认同步所有 Binding
并且无法明确禁用此行为。
但是,我们可以通过将属性包装在 ObservableObject
中并使用 Binding
初始值设定项根据所需行为获取自定义 Binding(get:set:)
来解决此问题。
(请注意,这可能不适用于标准 UI 组件,例如 Slider
,因为它们可能需要 Binding
更新才能正常工作。)
class ValueContainer: ObservableObject {
private var fieldValue: Float = 0
func getBinding(isTriggering: Bool) -> Binding<Float> {
Binding { [self] in
self.fieldValue
} set: { [self] newValue in
self.fieldValue = newValue
if isTriggering {
self.objectWillChange.send()
}
}
}
}
struct DoesNotTriggerUpdate: View {
@ObservedObject var container: ValueContainer
var body: some View {
Slider(value: container.getBinding(isTriggering: false))
}
}
struct DoesTriggerUpdate: View {
@ObservedObject var container: ValueContainer
var body: some View {
Slider(value: container.getBinding(isTriggering: true))
}
}