【问题标题】:How does one change the position of a Slider in SwiftUI?如何在 SwiftUI 中改变 Slider 的位置?
【发布时间】:2020-04-03 19:50:58
【问题描述】:

我正在尝试在按钮按下操作中更新/设置我的滑块值。

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

滑块值实际上发生了变化,但表盘没有移动或更新以表示新值。我的 Slider 值来自像这样的 Observable 对象:

class SliderVal: ObservableObject {

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

滑块的默认值设置为中间的 50,有什么方法可以将滑块值设置和更新为存储在数组中的值?输出滑块值实际上给了我正确的结果,那么为什么滑块表盘没有移动/更新?

谢谢

【问题讨论】:

    标签: slider swiftui


    【解决方案1】:

    示例:

    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 值的不断更新。现在我也实现了上面的代码,当按下改变它的值的按钮时,滑块不会更新。 - 谢谢
      • 我没有要测试的完整代码,但通常不需要willSet/didSet,而是使用直接绑定到ObservedObject,例如。 $slider.value
      猜你喜欢
      • 2019-11-27
      • 1970-01-01
      • 2016-10-13
      • 2019-10-22
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      相关资源
      最近更新 更多