原文地址: 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];
}