簡體   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