通常我们需要给一个UIView添加点击事件,最简单的做法是
UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)];
[self.view addGestureRecognizer:gesture];
- (void)tapGesture:(UITapGestureRecognizer *)gesture {
NSLog(@"点击了");
}
假如要给几十、几百个UIView添加点击事件,那上面的方法就显得有点恶心了,即使抽出一个公共方法,也会觉得有点low
接下来我们用一个比较高级的方法(运行时动态添加方法
)来给UIView添加点击事件
- 首先创建一个UIView的分类文件,并在分类里动态添加一个点击事件的方法
@interface UIView (Extension)
- (void)setTapActionWithBlock:(void (^)(void))block;
@end
static char kLAActionHandlerTapGestureKey;
static char kLAActionHandlerTapBlockKey;
@implementation UIView (Extension)
- (void)setTapActionWithBlock:(void (^)(void))block {
// 运行时获取单击对象
UITapGestureRecognizer *gesture = objc_getAssociatedObject(self, &kLAActionHandlerTapGestureKey);
if (!gesture) {
// 如果没有该对象,就创建一个
gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleActionForTapGesture:)];
[self addGestureRecognizer:gesture];
// 绑定一下gesture
objc_setAssociatedObject(self, &kLAActionHandlerTapGestureKey, gesture, OBJC_ASSOCIATION_RETAIN);
}
// 绑定一下block
objc_setAssociatedObject(self, &kLAActionHandlerTapBlockKey, block, OBJC_ASSOCIATION_COPY);
}
- (void)handleActionForTapGesture:(UITapGestureRecognizer *)gesture {
if (gesture.state == UIGestureRecognizerStateRecognized) {
// 取出上面绑定的block
void(^action)(void) = objc_getAssociatedObject(self, &kLAActionHandlerTapBlockKey);
if (action) {
action();
}
}
}
@end
接下来就可以直接使用了
- 导入头文件
#import "UIView+Extension.h"
- 在需要添加事件的UIView直接
setTapActionWithBlock
@weakify(self);
[self.tempView setTapActionWithBlock:^{
@strongify(self);
NSLog(@"点击了 = %@", self.tempView);
}];