美文网首页
使用runtime防止按钮短时间内被重复点击

使用runtime防止按钮短时间内被重复点击

作者: NateLam | 来源:发表于2016-09-03 09:51 被阅读48次

    最近看到一篇博客很好, 转来做个笔记, 就是关于标题所说的东西
    http://www.jianshu.com/p/65ce6471cd0f

    新建一个基于UIButton的category, 在.h里面把响应点击事件的属性声明出去

    @property (nonatomic, assign) NSTimeInterval custom_acceptEventInterval;// 可以用这个给重复点击加间隔
    

    来到.m, 先引入runtime的头文件,

    #import <objc/runtime.h>
    

    然后

    + (void)load{
        Method systemMethod = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
        SEL sysSEL = @selector(sendAction:to:forEvent:);
    
        Method customMethod = class_getInstanceMethod(self, @selector(custom_sendAction:to:forEvent:));
        SEL customSEL = @selector(custom_sendAction:to:forEvent:);
    
        //添加方法 语法:BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types) 若添加成功则返回No
        // cls:被添加方法的类  name:被添加方法方法名  imp:被添加方法的实现函数  types:被添加方法的实现函数的返回值类型和参数类型的字符串
        BOOL didAddMethod = class_addMethod(self, sysSEL, method_getImplementation(customMethod), method_getTypeEncoding(customMethod));
    
        //如果系统中该方法已经存在了,则替换系统的方法  语法:IMP class_replaceMethod(Class cls, SEL name, IMP imp,const char *types)
        if (didAddMethod) {
            class_replaceMethod(self, customSEL, method_getImplementation(systemMethod), method_getTypeEncoding(systemMethod));
        }else{
            method_exchangeImplementations(systemMethod, customMethod);
        
        }
    }
    
    - (NSTimeInterval )custom_acceptEventInterval{
        return [objc_getAssociatedObject(self, "UIControl_acceptEventInterval") doubleValue];
    }
    
    - (void)setCustom_acceptEventInterval:(NSTimeInterval)custom_acceptEventInterval{
        objc_setAssociatedObject(self, "UIControl_acceptEventInterval", @(custom_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (NSTimeInterval )custom_acceptEventTime{
        return [objc_getAssociatedObject(self, "UIControl_acceptEventTime") doubleValue];
    }
    
    - (void)setCustom_acceptEventTime:(NSTimeInterval)custom_acceptEventTime{
        objc_setAssociatedObject(self, "UIControl_acceptEventTime", @(custom_acceptEventTime), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (void)custom_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event{
    
          // 如果想要设置统一的间隔时间,可以在此处加上以下几句
        // 值得提醒一下:如果这里设置了统一的时间间隔,会影响UISwitch,如果想统一设置,又不想影响UISwitch,建议将UIControl分类,改成UIButton分类,实现方法是一样的
        // if (self.custom_acceptEventInterval <= 0) {
        //     // 如果没有自定义时间间隔,则默认为2秒
        //    self.custom_acceptEventInterval = 2;
        // }
    
        // 是否小于设定的时间间隔
        BOOL needSendAction = (NSDate.date.timeIntervalSince1970 - self.custom_acceptEventTime >= self.custom_acceptEventInterval);
    
        // 更新上一次点击时间戳
        if (self.custom_acceptEventInterval > 0) {
            self.custom_acceptEventTime = NSDate.date.timeIntervalSince1970;
        }
    
        // 两次点击的时间间隔小于设定的时间间隔时,才执行响应事件
        if (needSendAction) {
            [self custom_sendAction:action to:target forEvent:event];
        }
    }
    

    用的时候在所在类里引入这个类的头文件, 注意是#import ""
    然后需要的button属性.custom_acceptEventInterval赋值即可

    相关文章

      网友评论

          本文标题:使用runtime防止按钮短时间内被重复点击

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