iOS小技巧:用runtime 解决UIButton 重复点击问题
什么是這個(gè)問(wèn)題
我們的按鈕是點(diǎn)擊一次響應(yīng)一次, 即使頻繁的點(diǎn)擊也不會(huì)出問(wèn)題, 可是某些場(chǎng)景下還偏偏就是會(huì)出問(wèn)題.
通常是如何解決
我們通常會(huì)在按鈕點(diǎn)擊的時(shí)候設(shè)置這個(gè)按鈕不可點(diǎn)擊. 等待0.xS的延時(shí)后,在設(shè)置回來(lái); 或者在操作結(jié)束的時(shí)候設(shè)置可以點(diǎn)擊.
-?(IBAction)clickBtn1:(UIbutton?*)sender {sender.enabled?=?NO;doSomethingsender.enabled?=?YES; }如果涉及到按鈕不同狀態(tài)不同樣式的時(shí)候, 用enabled不見(jiàn)得夠用.還得額外加個(gè)變量來(lái)記錄狀態(tài).
-?(IBAction)clickBtn1:(UIbutton?*)sender {if?(doingSomeThing)?return;doingSomeThing?=?YES;doSomethingdoingSomeThing?=?NO; }筆者舉的例子是直接在響應(yīng)事件的周期內(nèi)直接禁止點(diǎn)擊的. 如果想做1秒內(nèi)禁止重復(fù)點(diǎn)擊的話(huà),則得用performSelector:withObject:afterDelay:
漂亮的解決是怎樣的
有了重復(fù)的代碼段就是有了一個(gè)共性, 就可以抽象出來(lái).
我們可以給按鈕添加一個(gè)屬性重復(fù)點(diǎn)擊間隔, 通過(guò)設(shè)置這個(gè)屬性來(lái)控制再次接受點(diǎn)擊事件的時(shí)間間隔.
@interface?UIControl?(XY) @property?(nonatomic,?assign)?NSTimeInterval?uxy_acceptEventInterval;???//?可以用這個(gè)給重復(fù)點(diǎn)擊加間隔 @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啟動(dòng)的時(shí)候,我們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在我們的點(diǎn)擊事件里呢,對(duì)點(diǎn)擊事件做下過(guò)濾
-?(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]; }實(shí)際使用起來(lái)就是這個(gè)樣子
????UIButton?*tempBtn?=?[UIButton?buttonWithType:UIButtonTypeCustom];[tempBtn?addTarget:self?action:@selector(clickWithInterval:)?forControlEvents:UIControlEventTouchUpInside];tempBtn.uxy_acceptEventInterval?=?0.5;文章至此就結(jié)束了.雖然不推薦大范圍用runtime, 但是小范圍內(nèi)使用還是可以解決不少小問(wèn)題的.
轉(zhuǎn)載于:https://www.cnblogs.com/YH-Coding/p/5327621.html
總結(jié)
以上是生活随笔為你收集整理的iOS小技巧:用runtime 解决UIButton 重复点击问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 反序列化存入数据库里面的session数
- 下一篇: Activity之间使用intent传递