什么是这个问题

我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题.

通常是如何解决

我们通常会在按钮点击的时候设置这个按钮不可点击. 等待0.xS的延时后,在设置回来; 或者在操作结束的时候设置可以点击.

- (IBAction)clickBtn1:(UIbutton *)sender
{sender.enabled = NO;doSomethingsender.enabled = YES;
}

如果涉及到按钮不同状态不同样式的时候, 用enabled不见得够用.还得额外加个变量来记录状态.

- (IBAction)clickBtn1:(UIbutton *)sender
{if (doingSomeThing) return;doingSomeThing = YES;doSomethingdoingSomeThing = NO;
}

笔者举的例子是直接在响应事件的周期内直接禁止点击的. 如果想做1秒内禁止重复点击的话,则得用performSelector:withObject:afterDelay:

漂亮的解决是怎样的

有了重复的代码段就是有了一个共性, 就可以抽象出来.

我们可以给按钮添加一个属性重复点击间隔, 通过设置这个属性来控制再次接受点击事件的时间间隔.

@interface UIControl (XY)
@property (nonatomic, assign) NSTimeInterval uxy_acceptEventInterval;   // 可以用这个给重复点击加间隔
@end
static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";
- (NSTimeInterval)uxy_acceptEventInterval
{return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];
}
- (void)setUxy_acceptEventInterval:(NSTimeInterval)uxy_acceptEventInterval
{objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(uxy_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

在app启动的时候,我们hook 所有的按钮的 event

@implementation UIControl (XY)
+ (void)load
{Method a = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));Method b = class_getInstanceMethod(self, @selector(__uxy_sendAction:to:forEvent:));method_exchangeImplementations(a, b);
}
@end

在我们的点击事件里呢,对点击事件做下过滤

- (void)__uxy_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
{if (self.uxy_ignoreEvent) return;if (self.uxy_acceptEventInterval > 0){self.uxy_ignoreEvent = YES;[self performSelector:@selector(setUxy_ignoreEvent:) withObject:@(NO) afterDelay:self.uxy_acceptEventInterval];}[self __uxy_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, 但是小范围内使用还是可以解决不少小问题的.

转载于:https://www.cnblogs.com/YH-Coding/p/5327621.html

iOS小技巧:用runtime 解决UIButton 重复点击问题相关推荐

  1. IOS小技巧–用runtime 解决UIButton 重复点击问题

    IOS小技巧–用runtime 解决UIButton 重复点击问题 什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题. 通常是如何解决 我 ...

  2. ios 连续点击button_iOS小技巧:用runtime 解决UIButton 重复点击问题

    作者:uxyheaven 授权本站转载. 什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题. 通常是如何解决 我们通常会在按钮点击的时候设 ...

  3. iOS小技巧21-MacOS 苹果系统下Outlook打不开,显示“您需要最新版本的Outlook才能使用此数据库”

    iOS小技巧21-MacOS 苹果系统下Outlook打不开,显示"您需要最新版本的Outlook才能使用此数据库" 错误信息: 解决方法:按照下图的路径删除指定文件夹后,重新打开 ...

  4. iOS小技巧11-Xcode中相对路径和绝对路径的使用

    iOS小技巧11-Xcode中相对路径和绝对路径的使用 1.绝对路径和相对路径的概念 绝对路径: 表示文件的位置的方式就是路径.例如路径:"D:\图片\周杰伦.jpg",就知道&q ...

  5. iOS 小技巧总结,绝对有你想要的

    iOS 小技巧总结,绝对有你想要的 原文链接:http://www.jianshu.com/p/4523eafb4cd4 在这里总结一些 iOS 开发中的小技巧,能大大方便我们的开发,持续更新. -- ...

  6. iOS小技巧12-苹果地图和高德地图的关系

    iOS小技巧12-苹果地图和高德地图的关系 苹果地图是美国苹果公司(Apple Inc.)研发的地图产品,运行于iOS系统. 高德地图是中国高德(AutoNavi)研发的地图产品,有iOS.Andro ...

  7. 三星s6老显示无服务器,三星手机最常见的故障和修复小技巧助你解决难题

    三星手机最常见的故障和修复小技巧助你解决难题 三星的Galaxy系列手机是市场上最好的设备之一.就像所有高端移动技术一样,随着软件和硬件的老化,你最终会遇到某种问题.本指南将向您介绍如何解决三星Gal ...

  8. android按钮防止重复点击事件,实例详解Android解决按钮重复点击问题

    为了防止用户或者测试MM疯狂的点击某个button,写个方法防止按钮连续点击.具体实例代码如下所示: public class BaseActivity extends Activity { prot ...

  9. iOS小技巧总结,绝对有你想要的(持续更新)

    在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIView a ...

最新文章

  1. 【Go】Go基础(八):结构体和方法
  2. 逻辑模型三要素-数据结构
  3. java和python的web自动化有什么区别-三分钟看懂Python和Java的区别
  4. 吴恩达第三周逻辑回归
  5. HighNewTech:支付宝全球首发5G手机,四大逆天功能(防骗三折叠气味识别自由飞)!
  6. Flutter:实现红包晃动效果
  7. SQL自动流水号函数
  8. Navigation Drawer介绍
  9. obs可以推到中转服务器吗,能否使用OBS(Open Broadcaster Software)、FMLE(Flash Media Live Encoder)等第三方软件进行推流?...
  10. 统计表中有无数据并发送邮件
  11. 【2022-01-06】JS逆向之QCC请求头参数
  12. 有一个包含 10 亿个搜索关键词的日志文件,如何快速获取到 Top 10 最热门的搜索关键词呢?
  13. 公众号搜题怎么实现的?
  14. RTSP/Onvif视频智能平台EasyNVR播放视频卡顿的原因分析及解决
  15. 真人快打11 技能键位
  16. 重t2加权是什么意思_魔兽世界怀旧服:为什么BWL打不腻,TAQ没多久大家都AFK了?...
  17. 机器学习基础:朴素贝叶斯分类器及其应用示例
  18. 理光Ricoh MP C5503 一体机驱动
  19. vue字符串换行(绝对管用)
  20. 笔记本外放无声而带上耳机有声的解决办法

热门文章

  1. java 文件随机读取_Java 实现文件随机读写-RandomAccessFile
  2. 图:DFS(深度优先搜索)图解分析代码实现
  3. vant 索引城市不对_Vant Area 省市区选择
  4. abb限位开关已打开drv1_施工升降机上有10个限位器,你都知道了吗?
  5. java中接口适配器实现,12.1.8 Java中的应用-AWT事件适配器(接口的适配器模式)...
  6. 【收藏】华为5700系列交换机常用配置示例
  7. KubeDL 0.4.0 - Kubernetes AI 模型版本管理与追踪
  8. 从零开始入门 K8s | 可观测性:你的应用健康吗?
  9. oracle查询blob数据,C#查询Oracle clob blob数据
  10. win10运行C语言的程序,win10系统运行软件提示应用程序发生异常0xc0000409的具体教程...