解决UIButton 连续点击重复响应事件问题
经常会遇到重复点击某个按钮 事件被响应多次的情景, 有时候可能对程序本身并没有什么影响 , 可有时候偏偏需要限制button响应事件直接的间隔 .
方法一 : 标记
1 . 利用空闲enable属性来标记
- (IBAction)clickBtn1:(UIbutton *)sender
{
sender.enabled = NO;
doSomething
sender.enabled = YES;
}
2. 专门定义一个属性标记
- (IBAction)clickBtn1:(UIbutton *)sender
{
if (doingSomeThing) return;
doingSomeThing = YES;
doSomething
doingSomeThing = NO;
}
方法二 : 利用runtime来实现
和前一种方法的实现原理基本一样 只不过通过给UIControl 添加分类 由此扩大了应用范围
首先给按钮条件一个属性 记录目标间隔时间
@interface UIControl (MYButton)
@property (nonatomic, assign) NSTimeInterval my_acceptEventInterval; // 可以用这个给重复点击加间隔
@end
static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";
- (NSTimeInterval)my_acceptEventInterval
{
return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];
}
- (void)setMy_acceptEventInterval:(NSTimeInterval)my_acceptEventInterval
{
objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(my_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@implementation UIControl (MYButton)
+ (void)load
{
Method a = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
Method b = class_getInstanceMethod(self, @selector(__my_sendAction:to:forEvent:));
method_exchangeImplementations(a, b);
}
@end
//定义自己的点击事件
- (void)__my_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
{
if (self.my_ignoreEvent) return;
if (self.my_acceptEventInterval > )
{
self.my_ignoreEvent = YES;
[self performSelector:@selector(setMy_ignoreEvent:) withObject:@(NO) afterDelay:self.my_acceptEventInterval];
}
[self __my_sendAction:action to:target forEvent:event];
}
实际使用起来就是这个样子
UIButton *tempBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[tempBtn addTarget:self action:@selector(clickWithInterval:) forControlEvents:UIControlEventTouchUpInside];
tempBtn.uxy_acceptEventInterval = 0.5;
一个应用Runtime 的小小实例
解决UIButton 连续点击重复响应事件问题的更多相关文章
- IOS开发之关于UIButton点击没有响应问题
1.如果一个UIButton的frame超出父视图的frame,UIButton还是可以显现的,但响应不了点击事件了,当开发中,遇到UIButton点击没有响应问题时,我们需要输出btn及它父视图的f ...
- Android连续点击多次事件的实现
有时候我们需要实现这样的场景,类似进入开发者模式,即多次点击后执行操作. 首先我们先看一个方法: System提供的一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制. publi ...
- android 解决ListView点击与滑动事件冲突
如果你的ListView的Item有滑动功能,但又点击Item跳转到其它activity,这样若是在Adapter里面写点击事件是会导致滑动事件获取不到焦点而失效: 解决方法:不要在adapter里面 ...
- 移动端-解决ios连续点击页面上移问题
引入js即可 //解决ios双击页面上移问题//在项目中测试不紧input/button这些表单控件有这个问题,p,div等也有问题,于是乎就直接在body开刀了(function(){ var ag ...
- iOS 开发经验谈,点击没响应事件
- 用js捕捉鼠标连续点击三次事件怎么实现啊
var count = 0, timer; document.onclick = function(){ if(count < 2){ if(timer){ clearTimeout(timer ...
- 【Android 7.1.1】 锁屏界面点击“空白处”响应事件
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLa ...
- 如何禁止用户连续点击一个按钮事件详细JS
<input type="button" id="submit" value="提交"> <script> $(do ...
- iOS小技巧–用runtime 解决UIButton 重复点击问题
什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题. 通常是如何解决 我们通常会在按钮点击的时候设置这个按钮不可点击. 等待0.xS的延时后 ...
随机推荐
- MySQL MMM 双主在Failover时挂起
两台MySQL服务器,版本Percona 5.5.35,配置双主,装在Centos 6.4下 Master1 db1,172.21.120.160(真实IP),172.21.120.173(Writ ...
- Java Web学习路线
2016-08-22的早上,本是一个很平静的早上,坐在去往公司的公交车上想到了很多之前上学时的点点滴滴,回想起来还真的是耐人寻味啊,当初青春的懵懂,当初的冲动,当初的做事不考虑后果! 也正是这耐人寻味 ...
- location对象说明
在浏览器的console层输入 location 即可输出该对象的相关信息 location.protocol 协议类型 http/https location.hostname 主机名 loc ...
- Python3基础 列表乘一个整数 扩增列表
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- juqery模板 Templates
现在已经有了许多JavaScript的解决方案模板,从这方面说,标准化的模板解决方案必然是大势所趋.在本节中,我们向你简要描述四个最流行最有趣的模板.现有的模板解决方案能解决什么?那些特色在jQuer ...
- UVA 11520 填充正方形
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 微信小程序-视图视图引用
引用 WXML 提供两种文件引用方式import和include. import import可以在该文件中使用目标文件定义的template,如: 在 item.wxml 中定义了一个叫item的t ...
- linux安装配置apk打包程序gradle+jdk+Android_sdk+python自动化编译脚本
安装gradle: 1.下载gradle包 去这里下载需要的tar.gz包:https://services.gradle.org/distributions/ 2.解压 tar zxvf gradl ...
- python 生成器生成杨辉三角
用Python写趣味程序感觉屌屌的,停不下来 #生成器生成展示杨辉三角 #原理是在一个2维数组里展示杨辉三角,空的地方用0,输出时,转化为' ' def yang(line): n,leng=0,2* ...
- Ubuntu 修改 ssh 登录后的欢迎信息
/etc/update-motd.d/90-updates-available cd /etc/update-motd.d/ vi 10-help-text 修改或者注释掉里面的内容 vi 90-up ...