Swift -- UIControl的分类

不管是OC还是Swift,一个继承自UIControl的类比如UIButton,注册一个点击事件的时候都会这么做:

Btn.addTarget............

说实话,已经用烦了!

封装一个

// MARK: - UIControl 添加 闭包

/// UIControl 的 Target-Action 转换为闭包的‘辅助类’
class ClosureSleeve {
    let closure: () -> ()
    
    init(attachTo: AnyObject, closure: @escaping () -> ()) {
        self.closure = closure
        objc_setAssociatedObject(attachTo, "[\(arc4random())]", self, .OBJC_ASSOCIATION_RETAIN)
    }
    
    @objc func invoke() {
        closure()
    }
}

/// 将UIControl 的 Target-Action 转换为闭包
extension UIControl {
    func addAction(for controlEvents: UIControl.Event = .primaryActionTriggered, action: @escaping () -> ()) {
        let sleeve = ClosureSleeve(attachTo: self, closure: action)
        addTarget(sleeve, action: #selector(ClosureSleeve.invoke), for: controlEvents)
    }
}

然后 Btn.addAction{ code } 即可,就很有Swift风格了

猜你喜欢

转载自blog.csdn.net/SoftwareDoger/article/details/98746862
今日推荐