У меня есть форма SwiftUI, с которой я работаю, которая обновляет значения EnvironmentObject. Мне нужно вызывать функцию, когда значение Picker меняется, но каждый найденный способ либо беспорядочный, либо вызывает другие проблемы. То, что я ищу, - это похожий способ работы Slider, но, похоже, его нет. Базовый c код без какого-либо решения находится здесь:
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())
}
}
}
После рассмотрения подобного (но другого) вопроса здесь: Есть ли способ вызвать функцию, когда выбор средства выбора SwiftUI изменяется? Я пытался использовать onReceive (), как показано ниже, но он также вызывается при изменении значения Slider, что приводит к нежелательному поведению.
.onReceive([self.valueHolder].publisher.first(), perform: {_ in
self.segmentedControlFunction()
})
Я попытался изменить параметр onReceive, чтобы отфильтровать его только по этому значению. Переданное значение является правильным, но функция segmentedControlFunction по-прежнему вызывается при перемещении ползунка, а не только при изменении выбора.
.onReceive([self.valueHolder.segmentedControlValue].publisher.first(), perform: {_ in
self.segmentedControlFunction()
})
Как мне вызвать функцию segmentedControlFunction аналогично функции sliderFunction?