在不触发更改的情况下更新 @Binding 值

时间:2021-07-20 11:18:25

标签: swift swiftui

我有一个 init 结构体

@Binding var fieldValue:Float

init(fieldValue:Binding<Float>) {
  self._fieldValue = fieldValue
}

在某些时候,我想更新 fieldValue 而不触发其他监听 $fieldValue 的点的更新。

这可能吗?

1 个答案:

答案 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))
    }

}