当 SwiftUI 中的 Slider 更改时如何触发功能?

Gia*_*gar 6 function slider swiftui

我试图sliderchanged()在滑块值更改时触发该功能,我可能会遗漏一些非常基本的东西,但我发现的所有类似的东西都不起作用。没有像 Slider 的“动作”或旧的“ValueChanged”动作之类的东西吗?

这是我的代码:

struct CustomSlider1: View {

    @State var progress: Float = 0.5
    var body: some View {

       VStack{
        Slider(value: $progress)
            .padding(.all)
            Text(String(progress))          
        }        
    }

    func sliderchanged() {
        //do things 
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!!

RPa*_*l99 23

您可以自定义Binding调用Binding's setter 中的函数:

@State var progress: Float = 0.5
var body: some View {

   VStack{
       Slider(value: Binding(get: {
           self.progress
       }, set: { (newVal) in
           self.progress = newVal
           self.sliderChanged()
       }))
       .padding(.all)
       Text(String(progress))
    }
}

func sliderChanged() {
    print("Slider value changed to \(progress)")
}
Run Code Online (Sandbox Code Playgroud)

  • 这正是大多数人在搜索关键字时所需要的,这些关键字将他们引向令人困惑的组合框架。干得好,谢谢! (7认同)
  • 请注意,当滑块滑块移动时,此解决方案提供连续更新。下面的 user3069232 的解决方案仅在拖动开始时提供一次更新,在拖动完成时提供第二次更新。 (3认同)

use*_*232 12

斯威夫特 5,iOS 13

另一种选择,简单地使用状态变量和闭包。

@State var alpha = 65
@State var alphaToShow = ""

Slider(value: $alpha, in: 65...90,step: 1,onEditingChanged: { data in
  self.alphaToShow = String(Character(UnicodeScalar(Int(self.alpha))!))
  // execute more code here
}
}).padding()
Text(alphaToShow)
Run Code Online (Sandbox Code Playgroud)

  • 如果您只想在拖动完成后进行更新,则此解决方案是最佳选择。如果您想要持续更新,则接受的答案就是您所需要的。 (4认同)
  • 因为它是 Enrique 列表中的第三个:),遗憾的是许多 SO 用户没有阅读绿色勾号之外的内容。 (3认同)

Kou*_*iga 6

使用onChange修饰符获得持续更新的另一种方法。

import SwiftUI

struct SliderOnChange: View {
    @State var progress: Float = 0.5

    var body: some View {
        VStack{
            Slider(value: self.$progress)
                .onChange(of: self.progress) { newProgress in
                    self.sliderChanged(to: newProgress)
                }
            Text(String(self.progress))
        }
    }

    func sliderChanged(to progress: Float) {
        print("Slider value changed to \(progress)")
    }
}
Run Code Online (Sandbox Code Playgroud)