Swift -- UIControl的分类

本文介绍了一种在Swift中简化UIControl事件处理的方法,通过封装自定义类ClosureSleeve,实现了将传统的target-action机制转换为更符合Swift风格的闭包形式,使代码更加简洁易读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不管是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风格了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值