iOS 对视图(view,label,button,imageView等)点击事件的封装,简单使用 Swift

1 篇文章 0 订阅
1 篇文章 0 订阅

额外拆入一个实用点,为了区分跟类自带函数名的相同,我们利用结构体来增加一个层级

//定一个结构体
public struct ZXSwift<Base> {
    public let base : Base
    public init(_ base : Base) {
        self.base = base
    }
}
public extension NSObjectProtocol { //拓展NSObjectProtocol类
	//定义一个我们需要的属性
    public var zx : ZXSwift<Self> {
        get{
            return ZXSwift(self)
        }
        set{
        }
    }
}

定义好一个结构体之后,我们利用结构体拓展NSObject类

extension ZXSwift where Base: NSObject{
    func associate(value :Any?,forKey :inout String){
        objc_setAssociatedObject(base, &forKey, value, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }
    
    func associatedValue(forKey :inout String) -> Any?{
        return objc_getAssociatedObject(base, &forKey)
    }
    
    func removeAllassociate(){
        objc_removeAssociatedObjects(base)
    }
}

下面是重点,要拓展UIView类了


private var UIViewTapKey = "UIViewTapKey"
typealias tapBlock = () -> Void

extension ZXSwift where Base: UIView{
    func tapped(block :@escaping () -> Void){
        
        base.isUserInteractionEnabled = true
        let tapGest = UITapGestureRecognizer(target: base, action: #selector(base.tappedAction))
        tapGest.numberOfTapsRequired = 1
        tapGest.numberOfTouchesRequired = 1
        base.addGestureRecognizer(tapGest)
        base.zx.associate(value: block, forKey: &UIViewTapKey)
    }
 	fileprivate func tappedAction(){
        if let tapBlock = base.zx.associatedValue(forKey: &UIViewTapKey) as? () -> Void{
            tapBlock()
        }
    }
}

封装完成,我们来调用一下

let lb = UILabel()
lb.zx.tapped {

}

let img = UIImageView()
img.zx.tapped {

}

怎么样,是不是很方便

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值