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

时间:2017-11-04 08:34:58

标签: ios uislider swift4 uicontrol

我的应用程序处于开发的原型阶段。某些滑块没有通过故事板或以编程方式为其分配任何操作。

我需要在测试期间滑块拖动停止时显示警告。可以通过UISlider

的扩展来完成

除非通过界面构建​​器或以编程方式分配其他操作,否则当拖动结束以显示警报时,如何为UISlider分配默认操作?

Similar Question

1 个答案:

答案 0 :(得分:4)

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)
    }
}

请检查此修改后的答案。