我如何扩展 UISlider 以便它使用回调来检测滑块值何时发生变化?

How can I extend UISlider so that it uses a callback which detects when the slider value has changed?

我想为 UISlider 创建一个扩展,它允许我在滑块值更改时使用回调来执行操作。换句话说,它与使用 UIControl.Event.valueChanged 添加动作具有相同的效果。

所以不要添加这样的操作:

let mySlider = UISlider()

mySlider.addTarget(self, action: #selector(sliderDidChangeValue(_:)), for: .valueChanged)

 @objc func sliderDidChangeValue(_ sender: UISlider) {
        print(sender.value)
 }

我想创建一个这样的扩展,但回调的行为与上述操作相同:

extension UISlider {

convenience init(value: Float = 0,
    range: ClosedRange<Float> = 0 ... 1,
    callback: @escaping (_ x: Float) -> Void = { _ in}) {

    self.init()
    self.value = value
    self.minimumValue = range.lowerBound
    self.maximumValue = range.upperBound

   }
}



let mySlider = UISlider(value: 10, range: 1...10) { (newValue) in
            print(newValue)
}

在我看来应该可以实现,但我真的不知道该怎么做。在此先感谢您的帮助。

如果要将闭包作为目标添加到 UISlider,则必须使用扩展将函数添加到 UISlider

@objc class SliderClass: NSObject {
    let closure: (_ val:Float)->()

    init (_ closure: @escaping (_ val:Float)->()) {
        self.closure = closure
    }

    @objc func sliderValueChange(sender:UISlider) {
        closure(sender.value)
    }
}

extension UISlider {
    func addAction(for controlEvents: UIControl.Event = .valueChanged, value : Float = 1, range : ClosedRange<Float> = 0 ... 1, _ closure: @escaping (_ val:Float)->()) {

        self.minimumValue = range.lowerBound
        self.maximumValue = range.upperBound
        self.value = value
        let classObj = SliderClass(closure)
        addTarget(classObj, action: #selector(SliderClass.sliderValueChange), for: controlEvents)
        objc_setAssociatedObject(self, "", classObj, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
    }
}

在您的class

中使用
slider.addAction(value:1.9,range: 0 ... 2) { (newValue) in
      print(String(format: "%.2f", newValue))
 }

slider.addAction(value:1.5, range: 0 ... 2) {
      print(String(format: "%.2f", [=12=]))
}