使用runtime 对UIbutton的点击事件进行封装

导语

我们写项目时都需要使用- (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents自定义btn的点击事件如果做一些特别简单的操作 能直接使用回调进行处理的话既增加了代码的阅读性又减少了代码量

思路

利用block来做回调 ,

一,创建一个UIbutton 的类目 利用runtime 创建一个block属性
typedef void(^chickTouchBlock)(void);
@property(nonatomic,strong)chickTouchBlock onechickBlock;
static chickTouchBlock _onechickBlock;

-(chickTouchBlock)onechickBlock{
    
    
    return objc_getAssociatedObject(self, &_onechickBlock);
}

-(void)setOnechickBlock:(chickTouchBlock)onechickBlock{
    
    
    objc_setAssociatedObject(self, &_onechickBlock, onechickBlock, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
}

ps:记得导入 #import

二,创建一个方法来实现UIbutton 点击的回调
/**
 给按钮添加回调点击事件

 @param events 响应事件类型
 @param chickBlock 回调block
 */
-(void)addShjWithControlEvens:(UIControlEvents)events ChickBlock:(chickTouchBlock)chickBlock;
方法的实现
-(void)addShjWithControlEvens:(UIControlEvents)events ChickBlock:(chickTouchBlock)chickBlock{
    
    [self setOnechickBlock:chickBlock];
    
    [self addTarget:self action:@selector(chickBtn) forControlEvents:events];
    
}

-(void)chickBtn{
    
    if (self.onechickBlock) {
        
        self.onechickBlock();
    }
    
}

三,方法的使用

 [self.chooseTimer addShjWithControlEvens:UIControlEventTouchUpInside ChickBlock:^{
        
        NSLog(@"测试");
    }];

demo有用的话给个star

你可能感兴趣的:(使用runtime 对UIbutton的点击事件进行封装)