主要實(shí)現(xiàn)通過(guò)runtime動(dòng)態(tài)關(guān)聯(lián)屬性。
上碼?。。?!
#import <UIKit/UIKit.h>
typedef void(^ButtonBlock)(UIButton* btn);
@interface UIButton (Block)
/**
* button 添加點(diǎn)擊事件
*
* @param block
*/
- (void)addAction:(ButtonBlock)block;
/**
* button 添加事件
*
* @param block
* @param controlEvents 點(diǎn)擊的方式
*/
- (void)addAction:(ButtonBlock)block forControlEvents:(UIControlEvents)controlEvents;
@end
////////////////////////////////////////////////////
#import "UIButton+Block.h"
#import <objc/runtime.h>
@implementation UIButton (Block)
static char ActionTag;
/**
* button 添加點(diǎn)擊事件 默認(rèn)點(diǎn)擊方式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 點(diǎn)擊的方式
*/
- (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 事件的響應(yīng)方法
*
* @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(@"我被點(diǎn)名了");
}];
[testButton addAction:^(UIButton *btn) {
NSLog(@"我被點(diǎn)名了");
} forControlEvents:UIControlEventTouchUpInside];
O了,喜歡的走心哦...