繁体   English   中英

在 SwiftUI 中初始化 Slider 值

[英]Initializing a Slider value in SwiftUI

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

我对 slider 有这样的看法:

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

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

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

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

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

像这样的东西怎么样:

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 var,以便在呈现它之前设置起始值。 我使用了 onAppear 但您可以在设置 myMinVal 的任何位置设置 sliderValue

您可以使用 slider 的最低最小值初始化您的 @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)
    }

我认为 Ludyem 正在做某事。 这个网站上,我找到了为什么在 init 中设置值不起作用的解释。

但是如果我们在 slider 上使用 onAppear function 我们可以确保默认值在这样的范围内

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM