如何在SwiftUI中更改滑块的位置?

3
我尝试在按钮按下操作中更新/设置我的滑块值。
        Button(action: {
            if self.questionNum == 1{
                print("End")
            }else{
                self.questionNum -= 1

                //This line here is where the value is being set.

                self.slider.value = self.model.answers[self.questionNum - 1] as! Double

                print(self.model.answers)
                print(self.slider.value)
                self.questionOpacity = 0
                self.model.currentQuestion = self.model.questions[self.questionNum - 1]
                DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) {
                    withAnimation(){
                        self.questionOpacity = 1
                    }
                }
            }
        }) {
            Text("Previous Question")
                .font(.system(size: 25))
                .fontWeight(.medium)
                .foregroundColor(Color.white)
                .multilineTextAlignment(.center)
        }

滑块的值实际上发生了变化,但刻度盘没有移动或更新以表示新值。我的滑块值来自于像这样的一个Observable对象:
class SliderVal: ObservableObject {

var didChange = PassthroughSubject<SliderVal,Never>()
var value = 50.0 {
   willSet {
    print(self.value)
 }
}

滑块的默认值设置为50,即中间位置。有没有办法将滑块的值设置为储存在我的数组中的值并进行更新?实际输出滑块的值给了我正确的结果,但为什么滑块不移动/更新呢?
谢谢。
2个回答

3

例子:

struct ContentView: View {

    @State var number : Float

    var body: some View {
        VStack {
            Slider(value: $number, in: 1...100)
                .padding()
            Text("You've selected \(Int(number))")
        }.onAppear() {
            self.number = 30
        }
    }
}

2

您使用的 ObservableObject 模式已经过时(它适用于 Beta 版本,现在不再适用)。相反,请使用默认的 @Published 属性包装器,它会自动更新您的视图,并在需要时提供相应的绑定。

因此,这是您的模型应该如何看起来...

class SliderVal: ObservableObject {
    @Published var value = 50.0
}

据我理解,这里应该声明一下。

在视图中(如我所理解的),它应该被声明。
@ObservedObject var slider = SliderVal()

好的,我明白了。那么关于willSet和didSet的实现呢?我在我的Observable Object中使用它们来接收Slider值的不断更新。此外,现在我已经实现了上述代码,当按下更改其值的按钮时,滑块不会更新。- 谢谢 - Luke Ireton
1
我没有你的完整代码来测试,但通常不需要使用willSet/didSet,而是直接绑定到ObservedObject,例如$slider.value - Asperi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接