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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab画地震复杂模型,基于MATLAB的地震正演模型实现

总 第 237 期2009 年 第 7 期计 算 机 与 数 字 工 程 37 7132  基 于 L 地 震 正 演 模 型 实 现 3贾 跃 玮 1)   杨   锐 2)(中 国 地 质 大 学 地 下 信 息 探 测 技 术 与 仪 器 教 育 部 重 点 实 验 室 1)   北 京   100083)(川 庆 钻 探 工 程 有 限 公 司 地 质 …

用matlab抽样定理验证,MATLAB抽样定理验证.docx

MATLAB抽样定理验证.docx目的通过 MATLAB 编程实现对时域抽样定理的验证,加深抽样定理的理解。同时训练应用计算机分析问题的能力。任务连续信号 ftcos8*pi*t2*sin40*pi*tcos24*pi*t,经过理想抽样后得到抽样信号 fst,通过理想低通滤波器后重构…

ios java 图片上传到服务器,iOS 图片上传服务器

最近搞图片上传,折腾了一个星期终于做出来了,网上搜出来的方法几乎都是好几年前的,试了好多都不能用,此次把代码公布出来供大家参考。注:部分代码是后台写的,此方法没用到第三方库。1.图片保存到本地同时上…

matlab判断能控和能观,实验三 利用Matlab分析能控性和能观性

实验三 利用Matlab分析能控性和能观性实验目的:熟练掌握利用Matlab中相关函数分析系统能控能观性、求取两种标准型、系统的结构分解的方法。实验内容:1、能控性与能观性分析中常用的有关Matlab函数有:Size(a,b) 获取矩阵的行和列的数目Ctrb(a…

JAVA table word,实战 | Java读取Word,包含表格!

本文转载自微信公众号「JAVA日知录」,作者单一色调。转载本文请联系JAVA日知录公众号。不能每天都发鸡汤呀,今天分享一篇开发实战。业务需求我们有这样一个需求,需要抽取出WORD文档中的内容,然后组装成特定的json格式发送给第三方…

基于matlab的频域辨识,基于Lab VIEW的控制系统频域分析研究

在系统设计和构成之前,必须对系统进行分析、综合和预测研究,从而得出系统的性能评价指标,如控制精度、响应速度和系统稳定性等。一般来说,我们可以从两个方面来对系统的性能进行分析,一是时域,二是频域,它们是从不同的侧面,以被研究系统的传递函数为依据,来研究系统的特性,关于…

php培训出生做微电影网站的,微电影分享网站织梦整站源码

使用说明:1、模板在目录下【themes】-【default】文件夹中2、logo等图片在【statics】-【images】中安装教程:1、传到空间,由于有很多人反应安装后首页样式都乱的,(强烈要求安装到根目录,如:127.0.0.1 / ww…

mysql分列查询,Mysql导出问题,乱码问题,为分列问题解决!!!

前言:本文可以先阅读完再跟着做。Mysql查询出的数据导出为csv最近遇到同学的一个需求,要求差寻一些数据然后导出给他,因为之前也有做过类似的事情,觉得可以一下就搞定,但是居然出现乱码又出现没有分列的情况&#xff0…

微信你scope 参数错误 php,微信开发: scope参数错误或没有scope权限解决方法

scope为snsapi_userinfo 未关注者点击授权提示 scope参数错误或没有scope权限解决方法出现这种错误网上查出现有的原因是:订阅号没有相关的权限账号没有认证,没有相关的权限那么这里遇到问题两种都不是。开发账号是 服务号,而且也是认证号。解决方法:错…

oracle什么时候用in,Oracle Study之---Oracle IN和NOT IN的使用

Oracle Study之---Oracle IN和NOT IN的使用NOT IN 与 IN 的区别:------------------------------------------------------------------------------------------------------not In 相当于<> all,如果 Not In 后面跟的是子查询的话&#xff0c;子查询中只要包含一个 nu…

oracle中having作用,oracle中having与where的区别

1、where 不能放在group by 的后面2、HAVING 是跟GROUP BY 连在一起用的&#xff0c;放在GROUP BY 后面&#xff0c;此时的作用相当于WHERE3.WHERE 后面的条件中不能有聚集函数&#xff0c;比如SUM(),AVG()等&#xff0c;而HAVING 可以where 条件group by 某个或某几个字段gro…

linux系统支持u盘格式,linux下U盘格式化

第一步&#xff0c;手动将挂在的U盘分区卸载&#xff1a;umount /dev/sdbumount /dev/sdb1第二步&#xff0c;准备格式化U盘&#xff0c;这里要提一句&#xff0c;U盘要被格式化成为fat格式&#xff0c;而用到的命令是mkfs.vfat这个命令要注意&#xff0c;根据你要格式化分区格…

Linux怎么查看保存的密码,在Linux中查看已保存的WiFi密码

在安装流行操作系统时&#xff0c;如 Windows 10、Ubuntu、macOS 等&#xff0c;都会要求用户提前输入 WiFi 密码。特别是 Ubuntu 系统&#xff0c;在配置安装向导时就可以连接 WiFi&#xff0c;以方便在系统安装过程就从网络获取最新更新&#xff0c;并在安装完成后就为用户提…

怎么判断linux22端口是否通,在Linux环境下使用SSH判断端口是否通(示例代码)

在Linux环境下使用SSH判断端口是否通在windows/linux环境下&#xff0c;可以使用telnet判断端口状态&#xff0c;但有时候在Linux环境下没有telnet&#xff0c;所以可以使用ssh判断端口状态。一、ssh使用方法&#xff1a;命令&#xff1a;ssh -v -p port [email protected]说明…

linux磁盘管理的命令行,Linux磁盘管理命令介绍

fdisk [options] device常用选项有&#xff1a;d删除一个分区n创建一个分区p显示分区信息t修改分区的系统idw保存分区表并推出q退出不保存创建分区时&#xff0c;如果分区数目大于4个&#xff0c;就要建立扩展分区&#xff0c;如果没有把全部磁盘容量给扩展分区&#xff0c;那…

linux 网卡 巨帧,Linux Kernel e1000e驱动巨型帧处理绕过安全检查漏洞

发布日期&#xff1a;2009-12-29更新日期&#xff1a;2010-01-13受影响系统&#xff1a;Linux kernel 2.6.32.3描述&#xff1a;--------------------------------------------------------------------------------BUGTRAQ ID: 37523CVE(CAN) ID: CVE-2009-4538Linux Kernel是…

linux将访问日志切成每天,最简单自动切割 nginx 访问日志示例

网站上线后&#xff0c;没怎么注意过日志&#xff0c;有一天需要查日志时&#xff0c;才发现竟然有 100 多个 G&#xff0c;一个文本文件竟然有 100 多个G&#xff0c;这也太大了。nginx 是一个非常轻量的 web 服务器&#xff0c;体积小、性能高、速度快等诸多优点。但不足的是…

linux脚本实现红绿灯,javascript 如何实现红绿灯效果呢?

摘要:下文讲述js实现红绿灯效果的方法分享&#xff0c;如下所示:实现思路:1.使用setinterval 重复调用颜色输出函数2.使用promise实现例://使用setInterval实现循环调用函数var n 0;function setRYG () {if (n % 3 0) { console.log(red) }else if (n % 3 1) { console.log(…

linux下如何启动vsftp服务,如何在Ubuntu 18.04上使用VSFTP快速设置FTP服务器

如果您需要配置一个FTP服务器快速启动运行&#xff0c;那么VSFTP的易用性是无与伦比的。如果你想将应用程序迁移到最新版本Ubuntu Linux服务器中&#xff0c;并且需要快速启动并运行FTP服务器。如何操作&#xff1f;这实际上非常简单。这里将使用VSFTP服务器向您展示如何做到这…

红帽linux kvm,初识RedHat虚拟化—KVM

redhat虚拟化之KVM初识虚拟化简介&#xff1a;虚拟化是指计算机元件在虚拟的基础上而不是真实的基础上运行。虚拟化技术可以扩大硬件的容量&#xff0c;简化软件的重新配置过程。CPU的虚拟化技术可以单CPU模拟多CPU并行&#xff0c;允许一个平台同时运行多个操作系统&#xff0…