iOS小技巧–用runtime 控制 UIButton 的重復點擊間隔

原文地址: http://blog.csdn.net/uxyheaven/article/details/48009197

今天無意間看到個很不錯的小技巧,怕忘記,記錄下。

有時候我們不希望用戶瘋狂的點擊某個按鈕,比如點擊按鈕發網絡請求的情況,可能因為網絡原因,點擊一次按鈕木有請求到數據,這時候用戶可能我瘋狂地點擊按鈕(是我,肯定這么干 - - !),這樣很容易出問題。 這時候我們可以設置重復點擊按鈕的間隔時間:

① 新建個繼承自 UIButton 的分類, .h文件增加兩個屬性?

@property(nonatomic,assign)NSTimeInterval repeatClickTime;

@property(nonatomic,assign,readonly)NSTimeInterval lx_acceptedEventTime;


② 因為是分類,想要在外部能夠引用就需要runtime 來申明下 ? .m文件 方法

#import <objc/runtime.h>

static const void *repeatClickTimeKey = &repeatClickTimeKey;

static const void *lx_acceptedEventTimeKey = &lx_acceptedEventTimeKey;

@implementationUIButton (RepeatClick)

- (NSTimeInterval)repeatClickTime

{

return[objc_getAssociatedObject(self,repeatClickTimeKey) doubleValue];

}

- (void)setRepeatClickTime:(NSTimeInterval)repeatClickTime

{

objc_setAssociatedObject(self,repeatClickTimeKey,@(repeatClickTime),OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

- (NSTimeInterval)lx_acceptedEventTime

{

return[objc_getAssociatedObject(self,lx_acceptedEventTimeKey)doubleValue];

}

- (void)setLx_acceptedEventTime:(NSTimeInterval)lx_acceptedEventTime

{

objc_setAssociatedObject(self,lx_acceptedEventTimeKey,@(lx_acceptedEventTime),OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

③ 過濾按鈕點擊事件

+(void)load

{

Methoda =class_getInstanceMethod(self,@selector(sendAction:to:forEvent:));

Methodb =class_getInstanceMethod(self,@selector(__lx_sendAction:to:forEvent:));

method_exchangeImplementations(a, b);

}

- (void)__lx_sendAction:(SEL)action to:(id)target forEvent:(UIEvent*)event

{

if(NSDate.date.timeIntervalSince1970-self.lx_acceptedEventTime<self.repeatClickTime) return;

if(self.repeatClickTime>0)

{

self.lx_acceptedEventTime=NSDate.date.timeIntervalSince1970;

}

[self__lx_sendAction:action to:target forEvent:event];

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容