[iOS日常]自定义点击事件

在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);
    }
}

小结

对于代码中的警告,一定要慎重对待,不能一股脑的给屏蔽了,这种自欺欺人的操作害人害己呀。

你可能感兴趣的:([iOS日常]自定义点击事件)