讓你的UIButton自帶block
#import "UIButton+CQBlock.h"
#import typedef void(^CQ_ButtonEventsBlock)(void);
@interface UIButton ()
/** 事件回調(diào)的block */
@property (nonatomic, copy) CQ_ButtonEventsBlock cq_buttonEventsBlock;
@end
@implementation UIButton (CQBlock)
//------- 添加屬性 -------//
static void *cq_buttonEventsBlockKey = &cq_buttonEventsBlockKey;
- (CQ_ButtonEventsBlock)cq_buttonEventsBlock {
return objc_getAssociatedObject(self, &cq_buttonEventsBlockKey);
}
- (void)setCq_buttonEventsBlock:(CQ_ButtonEventsBlock)cq_buttonEventsBlock {
objc_setAssociatedObject(self, &cq_buttonEventsBlockKey, cq_buttonEventsBlock, OBJC_ASSOCIATION_COPY);
}
/**
給按鈕綁定事件回調(diào)block
@param block 回調(diào)的block
@param controlEvents 回調(diào)block的事件
*/
- (void)cq_addEventHandler:(void (^)(void))block forControlEvents:(UIControlEvents)controlEvents {
self.cq_buttonEventsBlock = block;
[self addTarget:self action:@selector(cq_blcokButtonClicked) forControlEvents:controlEvents];
}
// 按鈕點(diǎn)擊
- (void)cq_blcokButtonClicked {
if (self.cq_buttonEventsBlock) {
self.cq_buttonEventsBlock();
}
}
@end
使用:
[button cq_addEventHandler:^{
NSLog(@"按鈕點(diǎn)擊");
}
方法命名我是模仿的BlocksKit:
[button bk_addEventHandler:^(id sender) {
NSLog(@"按鈕點(diǎn)擊");
}
然后所有button都帶有block了,用起來(lái)和BlocksKit感覺(jué)一樣。
這樣就以很小的改動(dòng)替換了RAC。
其實(shí)本質(zhì)就是利用category和runtime給UIButton添加了一個(gè)block屬性臀防,單擊的時(shí)候回調(diào)這個(gè)block