iOS小技巧--用runtime 解决UIButton 重复点击问题
2015-08-26 20:05
369 查看
iOS小技巧–用runtime 解决UIButton 重复点击问题
什么是这个问题
我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题.通常是如何解决
我们通常会在按钮点击的时候设置这个按钮不可点击. 等待0.xS的延时后,在设置回来; 或者在操作结束的时候设置可以点击.- (IBAction)clickBtn1:(UIbutton *)sender { sender.enabled = NO; doSomething sender.enabled = YES; }
如果涉及到按钮不同状态不同样式的时候, 用enabled不见得够用.还得额外加个变量来记录状态.
- (IBAction)clickBtn1:(UIbutton *)sender { if (doingSomeThing) return; doingSomeThing = YES; doSomething doingSomeThing = 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 (NSDate.date.timeIntervalSince1970 - self.uxy_acceptedEventTime < self.uxy_acceptEventInterval) return; if (self.uxy_acceptEventInterval > 0) { self.uxy_acceptedEventTime = NSDate.date.timeIntervalSince1970; } [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, 但是小范围内使用还是可以解决不少小问题的.
相关文章推荐
- MySQL Query 的优化—Join的实现原理及优化思路
- UITableView和UITableViewcell
- easyUI iframe中请求Session失效后iframe内跳转到首页的解决方案
- poj 3625 Building Roads 最小生成树(prime或kruskal+并查集)(算法归纳)
- POJ1679------The Unique MST
- poj 2299 Ultra-QuickSort(归并排序或是bit 树+离散化皆可)
- MySQL Query 的优化—合理设计并利用索引
- KendoUI之kendoGrid服务端分页
- UITableViewDelegate
- 【HDOJ 1005】 Number Sequence (裸矩阵快速幂)
- poj1458-Common Subsequence(最长公共子序列,LCS)
- hibernate4中使用createSQLQuery方法执行sql语句的用法
- ios UITableView中Cell的重用机制
- UI基础_transform
- UESTC 594 我要长高 单调队列优化DP
- MUI - 封装localStorage与plus.storage
- deque与vector的主要区别
- 创建虚拟机 Guest Is already in use 处理办法
- 百度编辑器ueditor初始化赋值
- IOS-笔记15(Unwind Segue,Action Sheets,Alert,NSTimer)