【问题标题】:Initializing a Slider value in SwiftUI在 SwiftUI 中初始化 Slider 值
【发布时间】:2020-10-21 10:59:00
【问题描述】:

在学习SwiftUI的过程中,遇到了这个问题。

我有这个带有滑块的视图:

struct RangeSpanView: View {
    var minimumValue,maximumValue:Double

    init(minSlide: UInt64,
         maxSlide: UInt64) {
        self.minimumValue = Double(minSlide)
        self.maximumValue = Double(maxSlide)
    }

    @State var sliderValue = 0.0

    var body: some View {
        VStack {
            HStack {
                Text("\(Int(minimumValue))")
                Slider(value: $sliderValue,
                       in: minimumValue...maximumValue)
                Text("\(Int(maximumValue))")
            }.padding()
            Text("\(Int(sliderValue))")
            Spacer()
        }
    }
}

这是加载视图的代码。

var body: some View {
    NavigationLink(destination: RangeSpanView(minSlide: myMinVal,
                                              maxSlide: myMaxVal),
                   label: {
                       .......... // Useful code.
    })
}

使用滑块可以正常工作。关于 sliderValue 的初始化,只有一点不一致的细节我想修复。

当前代码中的方式是 sliderValue 被初始化为 0.0,当最小值和最大值分别为 150.0 和 967.0(例如)时,这并不是我喜欢的。

我尝试了各种解决方案来将 sliderValue 初始化为 minimumValue(例如)以使其保持一致。但它总是失败并出现一些错误消息,抱怨Slider 对象中的某些“预期参数类型'绑定”。

那么,有没有合适的方法来解决这个问题?

【问题讨论】:

    标签: ios swift slider swiftui


    【解决方案1】:

    您可以使用滑块的最低最小值初始化 @State 变量。所以你不需要在 willApear() 方法中这样做。

    struct RangeSpanView: View {
        var minimumValue,maximumValue:Double
    
        //declare State here
        @State var sliderValue : Double
    
        init(minSlide: UInt64,
             maxSlide: UInt64) {
            self.minimumValue = Double(minSlide)
            self.maximumValue = Double(maxSlide)
    
            //Initialize the State with the lowest value
            self._sliderValue = State(initialValue: self.minimumValue)
        }
    

    【讨论】:

    • 是的,它有效。仅更改 State var 声明的位置。之后,我可以使用您建议的语法将它初始化为我在 init() 中喜欢的任何一致值。非常感谢。
    【解决方案2】:

    这样的事情怎么样:

    struct TestView: View {
        let myMinVal: UInt64 = UInt64.random(in: 100...200)
        let myMaxVal: UInt64 = UInt64.random(in: 400...600)
        
        @State var sliderValue: Double = 0
        
        var body: some View {
            RangeSpanView(
                minimumValue: Double(myMinVal),
                maximumValue: Double(myMaxVal),
                sliderValue: $sliderValue
            ).onAppear {
                self.sliderValue = Double(self.myMinVal)
            }
        }
    }
    
    struct RangeSpanView: View {
        var minimumValue: Double
        var maximumValue: Double
    
        @Binding var sliderValue: Double
    
        var body: some View {
            VStack {
                HStack {
                    Text("\(Int(minimumValue))")
                    Slider(value: $sliderValue,
                           in: minimumValue...maximumValue)
                    Text("\(Int(maximumValue))")
                }.padding()
                Text("\(Int(sliderValue))")
                Spacer()
            }
        }
    }
    
    

    您可以在 SliderValue 上使用 @Binding 变量,以便在呈现之前设置起始值。 我使用了 onAppear,但您可以在设置 myMinVal 的任何位置设置 sliderValue

    【讨论】:

      【解决方案3】:

      我认为 Ludyem 正在做某事。在this site 上,我找到了关于为什么在 init 中设置值不起作用的解释。

      但是如果我们在滑块上使用 onAppear 函数,我们可以确保默认值在这样的范围内

                      .onAppear {
                          if(self.sliderValue < self.minimumValue) {
                              self.sliderValue = self.minimumValue
                          }
                      }
      

      所以整个事情看起来像这样

      struct RangeSpanView: View {
        let minimumValue,maximumValue:Double
      
        init(minSlide: UInt64, maxSlide: UInt64) {
          self.minimumValue = Double(minSlide)
          self.maximumValue = Double(maxSlide)
        }
      
      @State var sliderValue = 0.0
      
      
      var body: some View {
          VStack {
              Text("hi guys")
              HStack {
                  Text("\(Int(minimumValue))")
                  Slider(value: $sliderValue,
                      in: minimumValue...maximumValue)
                      .onAppear {
                          if(self.sliderValue < self.minimumValue) {
                              self.sliderValue = self.minimumValue
                          }
                      }
                  Text("\(Int(maximumValue))")
              }.padding()
              Text("\(Int(sliderValue))")
              Spacer()
          }
       }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-10-24
        • 2019-11-03
        • 1970-01-01
        • 1970-01-01
        • 2020-12-23
        • 2021-09-28
        • 2021-12-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多