[英]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.