UIButton扩展Block点击事件

主要实现通过runtime动态关联属性。
上码!!!!

#import <UIKit/UIKit.h>

typedef void(^ButtonBlock)(UIButton* btn);

@interface UIButton (Block)

/**
 *  button 添加点击事件
 *
 *  @param block
 */
- (void)addAction:(ButtonBlock)block;

/**
 *  button 添加事件
 *
 *  @param block
 *  @param controlEvents 点击的方式
 */
- (void)addAction:(ButtonBlock)block forControlEvents:(UIControlEvents)controlEvents;

@end

////////////////////////////////////////////////////


#import "UIButton+Block.h"

#import <objc/runtime.h>

@implementation UIButton (Block)
static char ActionTag;

/**
 *  button 添加点击事件 默认点击方式UIControlEventTouchUpInside
 *
 *  @param block
 */
- (void)addAction:(ButtonBlock)block {
    objc_setAssociatedObject(self, &ActionTag, block, OBJC_ASSOCIATION_COPY_NONATOMIC);
    [self addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
}

/**
 *  button 添加事件
 *
 *  @param block
 *  @param controlEvents 点击的方式
 */
- (void)addAction:(ButtonBlock)block forControlEvents:(UIControlEvents)controlEvents {
    objc_setAssociatedObject(self, &ActionTag, block, OBJC_ASSOCIATION_COPY_NONATOMIC);
    [self addTarget:self action:@selector(action:) forControlEvents:controlEvents];
}

/**
 *  button 事件的响应方法
 *
 *  @param sender 
 */
- (void)action:(id)sender {
    ButtonBlock blockAction = (ButtonBlock)objc_getAssociatedObject(self, &ActionTag);
    if (blockAction) {
        blockAction(self);
    }
}
@end

使用方法如下

    UIButton *testButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    testButton.backgroundColor = [UIColor redColor];
    [self.view addSubview:testButton];
    
    [testButton addAction:^(UIButton *btn) {
        NSLog(@"我被点名了");
    }];
    
    [testButton addAction:^(UIButton *btn) {
         NSLog(@"我被点名了");
    } forControlEvents:UIControlEventTouchUpInside];
    

O了,喜欢的走心哦...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,046评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,314评论 19 139
  • 我们常常浮于生活的表面,却不问问自己究竟想要什么,究竟怎么努力才能得到自己想要的,奇怪的是,我们常常捅不透那层膜,...
    小琳仔呀阅读 984评论 0 0
  • 我觉得太郁闷了,还记得那个骚扰我的男生嘛,今天早晨我舍友先走,然后我一个人上班,下雨,我在等红绿灯,他居然从后面追...
    cocogao阅读 1,391评论 0 0
  • 文/Yolanda 家人和真正的朋友,是绝不存在“你不喝酒就是不给我面子”这种说法的。 天朝国情之下,酒被当成了一...
    乐小饮阅读 8,804评论 0 1