我们在创建继承自 UIControl 的控件时,不可避免的要为这些控件绑定事件,例如, UIButton,UITextFileld 等.通常我们的做法是将这些实例化的对象实现 addTarget: action: forControlEvents:
方法,然后再去响应绑定的事件.
下面用 block 的形式来实现同样的目的.
创建一个 UIControl 的扩展文件:
在. h 文件中对外公布一个方法:
@interface UIControl (Block)
- (void) handleControlEvent:(UIControlEvents)controlEvent withBlock:(void(^)())actionBlock;
@end
在. m 文件中去实现:
#import <objc/message.h>
static char controlEventKey;
@implementation UIControl (Block)
-(void)handleControlEvent:(UIControlEvents)controlEvent withBlock:(void (^)())actionBlock {
[self addTarget:self action:@selector(callActionBlock:) forControlEvents:controlEvent];
objc_setAssociatedObject(self, &controlEventKey, actionBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (void)callActionBlock:(id)sender {
void (^block)() = objc_getAssociatedObject(self, &controlEventKey);
if (block) block();
}
这样就完成了UIControl 响应事件的 block 形式的写法.
只要是继承自 UIControl 的类,就可以用对象调用对外公布的哪个方法就可以了.