Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SwiftUI:如何从Slider获取连续更新_Ios_Swift_Swiftui - Fatal编程技术网

Ios SwiftUI:如何从Slider获取连续更新

Ios SwiftUI:如何从Slider获取连续更新,ios,swift,swiftui,Ios,Swift,Swiftui,我正在试验SwiftUI和滑块控件,如下所示: struct MyView: View { @State private var value = 0.5 var body: some View { Slider(value: $value) { pressed in } } } 我试图在用户拖动时从滑块获取连续更新,但是它似乎只在值更改结束时更新值 有人玩过这个吗?知道如何使用SwiftUI滑块发布一系列值更改吗?也许合并 在Swif

我正在试验SwiftUI和滑块控件,如下所示:

struct MyView: View {

    @State private var value = 0.5

    var body: some View {
        Slider(value: $value) { pressed in
        }
    }
}
我试图在用户拖动时从
滑块
获取连续更新,但是它似乎只在值更改结束时更新值


有人玩过这个吗?知道如何使用SwiftUI滑块发布一系列值更改吗?也许合并

在SwiftUI中,您可以将诸如slider之类的UI元素绑定到数据模型中的属性,并在其中实现业务逻辑

例如,要获得连续滑块更新,请执行以下操作:

import SwiftUI
import Combine

final class SliderData: BindableObject {

  let didChange = PassthroughSubject<SliderData,Never>()

  var sliderValue: Float = 0 {
    willSet {
      print(newValue)
      didChange.send(self)
    }
  }
}

struct ContentView : View {

  @EnvironmentObject var sliderData: SliderData

  var body: some View {
    Slider(value: $sliderData.sliderValue)
  }
}

我无法在iOS 13 Beta 2上重现此问题。您的目标是哪个操作系统

使用自定义绑定,不仅在编辑结束后,还会针对每个小更改打印值

Slider(value: Binding<Double>(getValue: {0}, setValue: {print($0)}))
滑块(值:绑定(getValue:{0},setValue:{print($0}))

请注意,闭包(
{pressed in}
)仅在编辑结束开始和结束时报告,值流仅传递到绑定中。

经过多次尝试后,我使用以下代码结束。为了保持答案简短,这有点简化,但现在开始。我需要几样东西:

  • 在设置外部绑定之前,从滑块读取值更改并将其四舍五入到最接近的整数
  • 根据整数设置本地化提示值
struct AspectSlider:视图{
//提示文本本地化键的第一部分。
私有let hintKey:String
//当滑块的舍入值
更改为不同的整数。
私有let值:绑定
//用于跟踪滑块值的本地绑定。
@状态变量sliderValue:Double=0.0
init(值:Binding,hintKey:String){
自我价值=价值
self.hintKey=hintKey
}
var body:一些观点{
VStack(对齐:。尾部){
//从提示键和圆角滑块值生成的本地化文本提示。
文本(LocalizedStringKey(“\(hintKey)。\(self.value.value)”)
HStack{
文本(LocalizedStringKey(self.hintKey))
滑块(值:绑定)(
getValue:{self.$sliderValue.value},
setValue:{self.sliderChanged(toValue:$0)}
),
通过:4.0){if!$0{self.slideEnded()}
}
}
}
私有函数幻灯片(){
打印(“将滑块移动到最接近的整数值”)
self.sliderValue=self.sliderValue.rounded()
}
私有函数滑块已更改(toValue:Double){
$sliderValue.value=value
让roundedValue=Int(value.rounded())
如果roundedValue==self.value.value{
返回
}
打印(“更新值”)
self.value.value=舍入值
}
}
iOS 13.4,Swift 5.x

一个基于优秀解决方案的答案,只是我不想使用环境变量

class SliderData: ObservableObject {
let didChange = PassthroughSubject<SliderData,Never>()

@Published var sliderValue: Double = 0 {
  didSet {
    print("sliderValue \(sliderValue)")
    didChange.send(self)
   }
  }
}

@ObservedObject var sliderData:SliderData

Slider(value: $sliderData.sliderValue, in: 0...Double(self.textColors.count))
在版本11.4.1(11E503a)和Swift 5中。我没有复制它。 通过使用Combine,我可以从滑块的更改中获得持续更新

class SliderData: ObservableObject {

  @Published var sliderValue: Double = 0
  ...

}

struct ContentView: View {

  @ObservedObject var slider = SliderData()

  var body: some View {
    VStack {
      Slider(value: $slider.sliderValue)
      Text(String(slider.sliderValue))
    } 
  }
}  


只需使用Slider的onEditingChanged参数。当用户移动滑块或仍与滑块接触时,此参数为真。当参数从true变为false时,我会进行更新

struct MyView: View {

    @State private var value = 0.5

    func update(changing: Bool) -> Void {
        // Do whatever
    }

    var body: some View {
        Slider(value: $value, onEditingChanged: {changing in self.update(changing) }) 
        { pressed in }
    }
}

谢谢这对我很管用。我现在遇到的问题是,即使我拖动滑块按钮并记录值,按钮实际上也不会在显示器上移动。奇怪的啊。。。。刚刚找到了原因:-)@drekka为什么滑块旋钮没有移动?因为在这个简化的示例中,绑定的get闭包总是返回0。它不可能有任何其他价值。您必须将当前值存储在某个位置,例如@State变量中。谢谢。我还没有尝试过这个,但这是我想使用一个独立的模型和视图的方向。这是可行的,但在我目前正在使用的代码中,我想在当前视图中获得值并在那里处理它。有什么想法吗?@drekka您可以使用$sliderda.sliderValue访问视图中任何位置的当前值。这不管用吗?是的,确实管用,但我尝试只在滑块视图中访问它。不是通过环境对象。我很快会发布一些代码,让它在最新的Xcode:BindableObject->observateObject-Xcode 11.3中运行,这太棒了。感谢您提供的自定义绑定示例。
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
      ContentView(sliderData: SliderData.init())
    }
}
class SliderData: ObservableObject {

  @Published var sliderValue: Double = 0
  ...

}

struct ContentView: View {

  @ObservedObject var slider = SliderData()

  var body: some View {
    VStack {
      Slider(value: $slider.sliderValue)
      Text(String(slider.sliderValue))
    } 
  }
}  

struct MyView: View {

    @State private var value = 0.5

    func update(changing: Bool) -> Void {
        // Do whatever
    }

    var body: some View {
        Slider(value: $value, onEditingChanged: {changing in self.update(changing) }) 
        { pressed in }
    }
}