php重复点击按钮无效,完美解决UIButton按钮重复点击、多次响应的问题
最近测试老跑过来提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按钮重复点击、多次响应的问题相关推荐
- 苹果手机点击事件无效的解决办法
苹果手机兼容性问题: 除button标签外绑定点击事件无效: 在标签中加入样式: cursor:pointer;即可
- linux node 命令无效,完美解决linux下node.js全局模块找不到的情况
今天在在linux上用npm安装了pm2准备部署node项目,结果通过pm2命令启动项目的时候报pm2找不到,这很伤,以为pm2没有安装成功,但是在node安装目录下面的bin文件夹里面调用pm2却没 ...
- Oracle重复数据只删除一条,解决Oracle删除重复数据只留一条的方法详解
查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 where Id in (select Id from 表 group ...
- php mysql 重复提交数据_如何真正解决表单重复提交问题php代码
如何真正解决表单重复提交问题php代码 过去一切时代的精华尽在书中.以下是小编为大家搜索整理的如何真正解决表单重复提交问题php代码,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试网! ...
- php项目邮件连接无效,完美解决wordpress邮件链接无效的问题
教程介绍:解决wordpress新用户注册邮件链接无效以及重新设置密码链接无效的问题 解决流程 案例一.用户注册 当用户注册站点时,用户会收到如下注册信: 当用户点击链接时,却发现链接无效: 仔细观察 ...
- 使用vue-seamless-scroll自动滚动插件复制出来的数据点击事件无效的解决办法
引言:做可视化地图项目,使用vue-seamless-scroll实现表格数据自动滚动,有个bug就是复制出来的数据点击事件失效.这个插件底层的实现是cope的形式, 无限滚动原理:无限滚动的原理就是 ...
- jquery点击事件无效及解决办法
先放完整代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...
- 关于苹果手机点击事件无效的解决办法
最近在开发一个公众号,有一个点击事件,在安卓手机上可以使用,但是放在苹果手机上就不行了,而且有两个页面都有这个点击事件,第一个页面在苹果手机上可以正常使用,第二个页面就不行,第一个页面使用的是 $(' ...
- JAVA设置按钮无效_JAVA设置的按钮监听没有反应
展开全部 你还没给按钮添加监听器.62616964757a686964616fe59b9ee7ad9431333332643337 an1 = new JButton("确定"); ...
最新文章
- 有趣的python项目_推荐个超好玩的Python项目
- vue的post请求data可以传两个参吗_我知道的HTTP请求
- 传感器为什么在低量程偏差大_传感器复习
- glid加载不出来图片
- go去掉最后一个字符_可维护的Go代码程序指南(一)之变量篇
- PAT 1084. 外观数列 (20) - 乙级
- 向android获取文件路径,在Android上获取图像的文件路径
- 某些面向对象的思想--一步步更新
- eda课程设计,求救!!!!!!!!
- java运行环境搭建_java的运行环境
- python bmp转jpg_python将bmp转换为jpg格式并删除原图的具体操作
- 基于回声状态网络(ESN)的时间序列预测
- 计算机操作员要求,计算机操作员教学大纲
- mysql五日均线_中国股市:一根“5日均线”走天下,线上买,线下卖,简直了!...
- ps基础学习:钢笔工具抠图
- spark中repartition, coalesce, partitionBy, repartitionAndSortWithinPartitions 四种重分区算子
- 【macOS免费软件推荐】第6期:洛雪音乐
- 邮件营销软件怎么样?
- 对话高新兴总裁侯玉清:安防企业的翻身之战
- 研华数字量输入输出模块通讯——ADAM4050