ios - 当 SwiftUI Picker 选择更改 EnvironmentObject 时,有没有办法调用函数?

标签 ios swift slider swiftui picker

我有一个正在使用的 SwiftUI 表单,它更新了 EnvironmentObject 的值。当 Picker 的值发生变化时,我需要调用一个函数,但我发现的每一种方式要么真的很乱,要么导致其他问题。我正在寻找的是 Slider 工作的类似方式,但似乎没有。没有任何解决方案的基本代码在这里:

class ValueHolder : ObservableObject {

@Published var sliderValue : Float = 0.5
static let segmentedControlValues : [String] = ["one", "two", "three", "four", "five"]
@Published var segmentedControlValue : Int = 3

}
struct ContentView: View {

    @EnvironmentObject var valueHolder : ValueHolder

    func sliderFunction() {
        print(self.valueHolder.sliderValue)
    }
    func segmentedControlFunction() {
        print(ValueHolder.segmentedControlValues[self.valueHolder.segmentedControlValue])
    }

    var body: some View {
        Form {
            Text("\(self.valueHolder.sliderValue)")
            Slider(value: self.$valueHolder.sliderValue, onEditingChanged: {_ in self.sliderFunction()
            })
            Text("\(ValueHolder.segmentedControlValues[self.valueHolder.segmentedControlValue])")
            Picker("", selection: self.$valueHolder.segmentedControlValue) {
                ForEach(0..<ValueHolder.segmentedControlValues.count) {
                    Text("\(ValueHolder.segmentedControlValues[$0])")
                }
            }.pickerStyle(SegmentedPickerStyle())
        }
    }
}

在此处查看此类似(但不同)的问题后:Is there a way to call a function when a SwiftUI Picker selection changes?我已经尝试使用 onReceive() 如下,但是当 Slider 值更改时也会调用它,从而导致不需要的行为。
.onReceive([self.valueHolder].publisher.first(), perform: {_ in
                self.segmentedControlFunction()
            })

我尝试更改 onReceive 的参数以仅按该值过滤它。传递的值是正确的,但是当 slider 移动时,segmentedControlFunction 仍然会被调用,而不仅仅是在选择器更改时。
.onReceive([self.valueHolder.segmentedControlValue].publisher.first(), perform: {_ in
                self.segmentedControlFunction()
            })

如何以与sliderFunction 类似的方式调用segmentedControlFunction?

最佳答案

有更简单的方法,看起来更适合我。

通用架构如下

Picker("Label", selection: Binding(    // proxy binding
    get: { self.viewModel.value },     // get value from storage
    set: {
            self.viewModel.value = $0  // set value to storage

            self.anySideEffectFunction() // didSet function
    }) {
       // picker content
    }

关于ios - 当 SwiftUI Picker 选择更改 EnvironmentObject 时,有没有办法调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61517855/

相关文章:

ios - 如何在 iOS 中移动 slider 时在图像上应用亮度、对比度、 Gamma ?

swift - 协议(protocol)扩展中的 .sort 不起作用

ios - 项目名称更改后重新生成 Bridging-Header 和 -Swift.h 文件

ios - 将值传递给与 uiview 关联的类并让 draw 识别值而不是默认类值

css - 子 CSS 类(两个 slider 但需要不同的 css 规则)

ios - 围绕多边形绘制边框

iphone - 将 bool 属性保存到 iOS 中的文件。

ios - 我们可以使用 google api 绘制路线(没有多段线)吗?

wpf - 创建具有不同前后拇指背景颜色的 slider

javascript - 使用按钮和 jQuery 从左或右滑动 DIV