一、按鈕點(diǎn)擊后先取消之前的操作
- (void)buttonClicked:(id)sender{
//點(diǎn)擊按鈕后先取消之前的操作肆饶,再進(jìn)行需要進(jìn)行的操作
[[self class]cancelPreviousPerformRequestsWithTarget:selfselector:@selector(buttonClicked:) object:sender];
}
二秃嗜、按鈕點(diǎn)擊后設(shè)為不可點(diǎn)擊狀態(tài),幾秒后恢復(fù)
-(void)buttonClicked:(id)sender{
self.button.enabled = NO;
[self performSelector:@selector(changeButtonStatus) withObject:nil afterDelay:1.0f];//防止重復(fù)點(diǎn)擊
}
-(void)changeButtonStatus{
self.button.enabled =YES;
}
三澎羞、使用runtime
#import <UIKit/UIKit.h>
@interface UIControl (repeatedClick)
/**
可以重復(fù)點(diǎn)擊的時(shí)間間隔
默認(rèn)為0 不對(duì)按鈕重復(fù)點(diǎn)擊處理
*/
@property (nonatomic,assign) NSTimeInterval timeInterval;//用這個(gè)給重復(fù)點(diǎn)擊加間隔
/**
內(nèi)部屬性用于判斷是否忽略替換的點(diǎn)擊事件
*/
@property (nonatomic,assign) BOOL isIgnoreEvent;
@end
#import "UIControl+repeatedClick.h"
#import <objc/runtime.h>
#define defaultInterval 0.25 //默認(rèn)時(shí)間間隔
@implementation UIControl (repeatedClick)
- (NSTimeInterval)timeInterval{
return [objc_getAssociatedObject(self,_cmd)doubleValue];
}
- (void)setTimeInterval:(NSTimeInterval)timeInterval{
objc_setAssociatedObject(self,@selector(timeInterval),@(timeInterval),OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (void)setIsIgnoreEvent:(BOOL)isIgnoreEvent{
objc_setAssociatedObject(self,@selector(isIgnoreEvent),@(isIgnoreEvent),OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (BOOL)isIgnoreEvent{
return [objc_getAssociatedObject(self,_cmd)boolValue];
}
- (void)resetState{
[self setIsIgnoreEvent:NO];
}
+ (void)load{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SEL selA = @selector(sendAction:to:forEvent:);
SEL selB = @selector(mySendAction:to:forEvent:);
Method methodA = class_getInstanceMethod(self, selA);
Method methodB = class_getInstanceMethod(self, selB);
//將methodB的實(shí)現(xiàn)添加到系統(tǒng)方法中也就是說(shuō)將methodA方法指針添加成方法methodB的返回值表示是否添加成功
BOOL isAdd = class_addMethod(self, selA,method_getImplementation(methodB),method_getTypeEncoding(methodB));
//添加成功了說(shuō)明本類中不存在methodB所以此時(shí)必須將方法b的實(shí)現(xiàn)指針換成方法A的髓绽,否則b方法將沒(méi)有實(shí)現(xiàn)。
if(isAdd) {
class_replaceMethod(self, selB,method_getImplementation(methodA),method_getTypeEncoding(methodA));
}else{
//添加失敗了說(shuō)明本類中有methodB的實(shí)現(xiàn)妆绞,此時(shí)只需要將methodA和methodB的IMP互換一下即可顺呕。
method_exchangeImplementations(methodA, methodB);
}
});
}
- (void)mySendAction:(SEL)action to:(id)target forEvent:(UIEvent*)event{
if([NSStringFromClass(self.class) isEqualToString:@"UIButton"]) {
self.timeInterval = self.timeInterval == 0 ? defaultInterval:self.timeInterval;
if(self.isIgnoreEvent){
return;
}else if(self.timeInterval > 0){
[self performSelector:@selector(resetState)withObject:nil afterDelay:self.timeInterval];
}
}
//此處methodA和methodB方法IMP互換了,實(shí)際上執(zhí)行sendAction括饶;所以不會(huì)死循環(huán)
self.isIgnoreEvent = YES;
[self mySendAction:action to:target forEvent:event];
}
@end