美文网首页
[iOS日常]自定义点击事件

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

作者: aitality | 来源:发表于2021-01-20 08:17 被阅读0次

    在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日常]自定义点击事件

          本文链接:https://www.haomeiwen.com/subject/uumhzktx.html