在iOS开发中,UI控件的点击并不是默认都添加了,如UIView,UILabel,UIImageView等等都没有默认的点击支持。给任意uiview添加点击很简单,但是有一些细节还是需要注意一下。
常规用法
demo如下
UIView *testView = [UIView new];
UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onClick)];
[testView addGestureRecognizer:recognizer];
很简单吧,可是你会发现点击没反应,那是因为少了一个设置:
//默认是NO
testView.userInteractionEnabled=YES;
在列表中使用
我们都知道列表最大的特点就是复用,处理点击我们就需要知道这个点击事件到底是哪个cell的的哪个view点击的,在此不讨论列表点击处理的具体实现,只说明view的点击传递。这个时候就要用到Target-Action模式了。
@interface TestView : UIView
@property (assign, nonatomic) id target;
@property (assign, nonatomic) SEL action;
@end
@implementation TestView
//其他代码省略
UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onClick)];
[self addGestureRecognizer:recognizer];
//其他代码省略
-(void) onClick {
[self.target performSelector:self.action];
}
@end
如上,就可知道点击的view是谁了,但是会有警告:
PerformSelector may cause a leak because its selector is unknown
正确的写法
-(void) onClick {
if([self.target respondsToSelector:self.action]) {
IMP imp = [self.target methodForSelector:self.action];
void (*func)(id, SEL, UIView *) = (void *)imp;
func(self.target, self.action, self);
}
}
小结
对于代码中的警告,一定要慎重对待,不能一股脑的给屏蔽了,这种自欺欺人的操作害人害己呀。