以编程方式为所有 UISlider 分配默认操作

Assign Default Action to all UISlider programmatically

我的应用程序处于开发原型阶段。一些滑块没有通过情节提要或编程方式分配给它们的任何动作。

我需要在测试期间停止拖动滑块时显示警告。这可以通过 UISlider 的扩展来完成吗?

如何在拖动结束时将默认操作分配给 UISlider 以显示警报,除非通过界面生成器或以编程方式分配另一个操作?

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    self.checkButtonAction()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

}

}

extension UIViewController{
    func checkButtonAction(){
        for view in self.view.subviews as [UIView] {
            if let btn = view as? UISlider {
                if (btn.allTargets.isEmpty){
                    btn.add(for: .allTouchEvents, {
                        if (!btn.isTracking){
                            let alert = UIAlertController(title: "Test 3", message:"No selector", preferredStyle: UIAlertControllerStyle.alert)

                            // add an action (button)
                            alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))

                            // show the alert
                            self.present(alert, animated: true, completion: nil)
                        }
                    })
                }
            }
        }

    }
}

class ClosureSleeve {
    let closure: ()->()

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

@objc func invoke () {
    closure()
}
}

extension UIControl {
    func add (for controlEvents: UIControlEvents, _ closure: @escaping ()->()) {
        let sleeve = ClosureSleeve(closure)
        addTarget(sleeve, action: #selector(ClosureSleeve.invoke), for: controlEvents)
        objc_setAssociatedObject(self, String(format: "[%d]", arc4random()), sleeve, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
    }
}

请检查这个修改后的答案。