iOS小技巧:用runtime 解决UIButton 重复点击问题
什么是这个问题
我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题.
通常是如何解决
我们通常会在按钮点击的时候设置这个按钮不可点击. 等待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 重复点击问题相关推荐
- IOS小技巧–用runtime 解决UIButton 重复点击问题
IOS小技巧–用runtime 解决UIButton 重复点击问题 什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题. 通常是如何解决 我 ...
- ios 连续点击button_iOS小技巧:用runtime 解决UIButton 重复点击问题
作者:uxyheaven 授权本站转载. 什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题. 通常是如何解决 我们通常会在按钮点击的时候设 ...
- iOS小技巧21-MacOS 苹果系统下Outlook打不开,显示“您需要最新版本的Outlook才能使用此数据库”
iOS小技巧21-MacOS 苹果系统下Outlook打不开,显示"您需要最新版本的Outlook才能使用此数据库" 错误信息: 解决方法:按照下图的路径删除指定文件夹后,重新打开 ...
- iOS小技巧11-Xcode中相对路径和绝对路径的使用
iOS小技巧11-Xcode中相对路径和绝对路径的使用 1.绝对路径和相对路径的概念 绝对路径: 表示文件的位置的方式就是路径.例如路径:"D:\图片\周杰伦.jpg",就知道&q ...
- iOS 小技巧总结,绝对有你想要的
iOS 小技巧总结,绝对有你想要的 原文链接:http://www.jianshu.com/p/4523eafb4cd4 在这里总结一些 iOS 开发中的小技巧,能大大方便我们的开发,持续更新. -- ...
- iOS小技巧12-苹果地图和高德地图的关系
iOS小技巧12-苹果地图和高德地图的关系 苹果地图是美国苹果公司(Apple Inc.)研发的地图产品,运行于iOS系统. 高德地图是中国高德(AutoNavi)研发的地图产品,有iOS.Andro ...
- 三星s6老显示无服务器,三星手机最常见的故障和修复小技巧助你解决难题
三星手机最常见的故障和修复小技巧助你解决难题 三星的Galaxy系列手机是市场上最好的设备之一.就像所有高端移动技术一样,随着软件和硬件的老化,你最终会遇到某种问题.本指南将向您介绍如何解决三星Gal ...
- android按钮防止重复点击事件,实例详解Android解决按钮重复点击问题
为了防止用户或者测试MM疯狂的点击某个button,写个方法防止按钮连续点击.具体实例代码如下所示: public class BaseActivity extends Activity { prot ...
- iOS小技巧总结,绝对有你想要的(持续更新)
在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIView a ...
最新文章
- 【Go】Go基础(八):结构体和方法
- 逻辑模型三要素-数据结构
- java和python的web自动化有什么区别-三分钟看懂Python和Java的区别
- 吴恩达第三周逻辑回归
- HighNewTech:支付宝全球首发5G手机,四大逆天功能(防骗三折叠气味识别自由飞)!
- Flutter:实现红包晃动效果
- SQL自动流水号函数
- Navigation Drawer介绍
- obs可以推到中转服务器吗,能否使用OBS(Open Broadcaster Software)、FMLE(Flash Media Live Encoder)等第三方软件进行推流?...
- 统计表中有无数据并发送邮件
- 【2022-01-06】JS逆向之QCC请求头参数
- 有一个包含 10 亿个搜索关键词的日志文件,如何快速获取到 Top 10 最热门的搜索关键词呢?
- 公众号搜题怎么实现的?
- RTSP/Onvif视频智能平台EasyNVR播放视频卡顿的原因分析及解决
- 真人快打11 技能键位
- 重t2加权是什么意思_魔兽世界怀旧服:为什么BWL打不腻,TAQ没多久大家都AFK了?...
- 机器学习基础:朴素贝叶斯分类器及其应用示例
- 理光Ricoh MP C5503 一体机驱动
- vue字符串换行(绝对管用)
- 笔记本外放无声而带上耳机有声的解决办法
热门文章
- java 文件随机读取_Java 实现文件随机读写-RandomAccessFile
- 图:DFS(深度优先搜索)图解分析代码实现
- vant 索引城市不对_Vant Area 省市区选择
- abb限位开关已打开drv1_施工升降机上有10个限位器,你都知道了吗?
- java中接口适配器实现,12.1.8 Java中的应用-AWT事件适配器(接口的适配器模式)...
- 【收藏】华为5700系列交换机常用配置示例
- KubeDL 0.4.0 - Kubernetes AI 模型版本管理与追踪
- 从零开始入门 K8s | 可观测性:你的应用健康吗?
- oracle查询blob数据,C#查询Oracle clob blob数据
- win10运行C语言的程序,win10系统运行软件提示应用程序发生异常0xc0000409的具体教程...