日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/3/20 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS小技巧:用runtime 解决UIButton 重复点击问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是這個問題

我們的按鈕是點擊一次響應一次, 即使頻繁的點擊也不會出問題, 可是某些場景下還偏偏就是會出問題.

通常是如何解決

我們通常會在按鈕點擊的時候設置這個按鈕不可點擊. 等待0.xS的延時后,在設置回來; 或者在操作結束的時候設置可以點擊.

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

如果涉及到按鈕不同狀態(tài)不同樣式的時候, 用enabled不見得夠用.還得額外加個變量來記錄狀態(tài).

-?(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 重复点击问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。