最近测试老跑过来提bug,说按钮可以点好几次,然后蹦出来好几个一样的界面出来,解决了一个地方,其他地方也会冒出一样的问题来,仔细一想,还是要从根本上解决问题,于是想了几个方法:

1.添加UIButton分类,重写-(BOOL)isTouchInside方法,让按钮在点击了一次之后的0.2s(可设置)之内变成不可点击状态

#import "UIButton+BK.h"

@implementation UIButton (BK)

-(BOOL)isTouchInside

{

self.enabled = NO;

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

self.enabled = YES;

});

return YES;

}

@end

这种做法很简单粗暴,而且亲测有效,唯一的缺点就是在按钮点击之后的0.2s内按钮状态是不可点击状态的(灰色),虽说0.2s很短,但是追求极致体验的程序员肯定不会允许这种情况发生对吧 : ) 于是想到了另外一种方法

2.还是添加UIButton分类,利用runtime运行时机制,让按钮点击之后的短时间内不再响应此事件,废话不多说,show me the code

//

// UIButton+BK.h

// BMKP

//

// Created by 演员新之助 on 16/9/5.

// Copyright © 2016年 Bmkp. All rights reserved.

//

#import

#define defaultInterval 0.5//默认时间间隔

@interface UIButton (BK)

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

@property(nonatomic,assign)BOOL isIgnoreEvent;//YES不允许点击NO允许点击

@end

---------------------------我是可爱的分割线--------------------------

//

// UIButton+BK.m

// BMKP

//

// Created by 演员新之助 on 16/9/5.

// Copyright © 2016年 Bmkp. All rights reserved.

//

#import "UIButton+BK.h"

@implementation UIButton (BK)

-(BOOL)isTouchInside

{

// self.enabled = NO;

// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

// self.enabled = YES;

// });

funclog

return YES;

}

- (NSTimeInterval)timeInterval

{

return[objc_getAssociatedObject(self,_cmd)doubleValue];

}

- (void)setTimeInterval:(NSTimeInterval)timeInterval

{

objc_setAssociatedObject(self,@selector(timeInterval),@(timeInterval),OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

//runtime动态绑定属性

- (void)setIsIgnoreEvent:(BOOL)isIgnoreEvent{

//注意BOOL类型需要用OBJC_ASSOCIATION_RETAIN_NONATOMIC不要用错,否则set方法会赋值出错

objc_setAssociatedObject(self,@selector(isIgnoreEvent),@(isIgnoreEvent),OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

- (BOOL)isIgnoreEvent{

//_cmd == @select(isIgnore);和set方法里一致

return[objc_getAssociatedObject(self,_cmd)boolValue];

}

- (void)resetState{

[self setIsIgnoreEvent:NO];

}

+ (void)load{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

SEL selA =@selector(sendAction:to:forEvent:);

SEL selB =@selector(mySendAction:to:forEvent:);

Method methodA =class_getInstanceMethod(self, selA);

Method methodB =class_getInstanceMethod(self, selB);

//将methodB的实现添加到系统方法中也就是说将methodA方法指针添加成方法methodB的返回值表示是否添加成功

BOOL isAdd =class_addMethod(self, selA,method_getImplementation(methodB),method_getTypeEncoding(methodB));

//添加成功了说明本类中不存在methodB所以此时必须将方法b的实现指针换成方法A的,否则b方法将没有实现。

if(isAdd) {

class_replaceMethod(self, selB,method_getImplementation(methodA),method_getTypeEncoding(methodA));

}else{

//添加失败了说明本类中有methodB的实现,此时只需要将methodA和methodB的IMP互换一下即可。

method_exchangeImplementations(methodA, methodB);

}

});

}

//当我们按钮点击事件sendAction时将会执行mySendAction

- (void)mySendAction:(SEL)action to:(id)target forEvent:(UIEvent*)event

{

if([self isKindOfClass:[UIButton class]]) {

self.timeInterval=self.timeInterval==0?defaultInterval:self.timeInterval;

if(self.isIgnoreEvent){

return;

}else if(self.timeInterval>0){

[self performSelector:@selector(resetState)withObject:nil afterDelay:self.timeInterval];

}

}

//此处methodA和methodB方法IMP互换了,实际上执行sendAction;所以不会死循环

self.isIgnoreEvent=YES;

[self mySendAction:action to:target forEvent:event];

}

@end

这样就完美解决的按钮重复点击的问题,亲测有效

如果大家有更简便的方法,欢迎交流 : )

php重复点击按钮无效,完美解决UIButton按钮重复点击、多次响应的问题相关推荐

  1. 苹果手机点击事件无效的解决办法

    苹果手机兼容性问题: 除button标签外绑定点击事件无效: 在标签中加入样式: cursor:pointer;即可

  2. linux node 命令无效,完美解决linux下node.js全局模块找不到的情况

    今天在在linux上用npm安装了pm2准备部署node项目,结果通过pm2命令启动项目的时候报pm2找不到,这很伤,以为pm2没有安装成功,但是在node安装目录下面的bin文件夹里面调用pm2却没 ...

  3. Oracle重复数据只删除一条,解决Oracle删除重复数据只留一条的方法详解

    查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 where Id in (select Id from 表 group ...

  4. php mysql 重复提交数据_如何真正解决表单重复提交问题php代码

    如何真正解决表单重复提交问题php代码 过去一切时代的精华尽在书中.以下是小编为大家搜索整理的如何真正解决表单重复提交问题php代码,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试网! ...

  5. php项目邮件连接无效,完美解决wordpress邮件链接无效的问题

    教程介绍:解决wordpress新用户注册邮件链接无效以及重新设置密码链接无效的问题 解决流程 案例一.用户注册 当用户注册站点时,用户会收到如下注册信: 当用户点击链接时,却发现链接无效: 仔细观察 ...

  6. 使用vue-seamless-scroll自动滚动插件复制出来的数据点击事件无效的解决办法

    引言:做可视化地图项目,使用vue-seamless-scroll实现表格数据自动滚动,有个bug就是复制出来的数据点击事件失效.这个插件底层的实现是cope的形式, 无限滚动原理:无限滚动的原理就是 ...

  7. jquery点击事件无效及解决办法

    先放完整代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  8. 关于苹果手机点击事件无效的解决办法

    最近在开发一个公众号,有一个点击事件,在安卓手机上可以使用,但是放在苹果手机上就不行了,而且有两个页面都有这个点击事件,第一个页面在苹果手机上可以正常使用,第二个页面就不行,第一个页面使用的是 $(' ...

  9. JAVA设置按钮无效_JAVA设置的按钮监听没有反应

    展开全部 你还没给按钮添加监听器.62616964757a686964616fe59b9ee7ad9431333332643337 an1 = new JButton("确定"); ...

最新文章

  1. 有趣的python项目_推荐个超好玩的Python项目
  2. vue的post请求data可以传两个参吗_我知道的HTTP请求
  3. 传感器为什么在低量程偏差大_传感器复习
  4. glid加载不出来图片
  5. go去掉最后一个字符_可维护的Go代码程序指南(一)之变量篇
  6. PAT 1084. 外观数列 (20) - 乙级
  7. 向android获取文件路径,在Android上获取图像的文件路径
  8. 某些面向对象的思想--一步步更新
  9. eda课程设计,求救!!!!!!!!
  10. java运行环境搭建_java的运行环境
  11. python bmp转jpg_python将bmp转换为jpg格式并删除原图的具体操作
  12. 基于回声状态网络(ESN)的时间序列预测
  13. 计算机操作员要求,计算机操作员教学大纲
  14. mysql五日均线_中国股市:一根“5日均线”走天下,线上买,线下卖,简直了!...
  15. ps基础学习:钢笔工具抠图
  16. spark中repartition, coalesce, partitionBy, repartitionAndSortWithinPartitions 四种重分区算子
  17. 【macOS免费软件推荐】第6期:洛雪音乐
  18. 邮件营销软件怎么样?
  19. 对话高新兴总裁侯玉清:安防企业的翻身之战
  20. 研华数字量输入输出模块通讯——ADAM4050

热门文章

  1. HDU Integer's Power(容斥原理)
  2. 关于ZipOupputStream添加压缩包常见问题
  3. Python shutil.md
  4. CJOJ 1087 【NOIP2010】乌龟棋 / Luogu 1541 乌龟棋(动态规划)
  5. 一ElasticSearch安装启动
  6. JMX学习笔记(一)-MBean
  7. Android - 布局详解之LinearLayout与RelativeLayout
  8. sql 系统函数取表基本信息
  9. 选择、插入、冒泡排序
  10. #ifdef,#ifndef,#define,#endif解析(原)