ios 防止按鈕多次點擊

防止按鈕被重復點擊這里提供3種方法:

第一種:先取消之前的操作在執行

-?(void)buttonClicked:(id)sender{

//點擊按鈕后先取消之前的操作,再進行需要進行的操作

[[self class]cancelPreviousPerformRequestsWithTarget:self selector:@selector(buttonClicked:)object:sender];

[self performSelector:@selector(buttonClicked:?)withObject:sender afterDelay:0.2f];

}

第二種:點擊后設為不可點擊,幾秒后恢復狀態

-(void)buttonClicked:(id)sender{

self.button.enabled?= NO;

[self performSelector:@selector(changeButtonStatus)withObject:nil afterDelay:1.0f];//防止重復點擊

}

-(void)changeButtonStatus{

self.button.enabled?=YES;

}

第三種:runtime?

創建繼承UIButton的Category文件

.h文件

#import

#define?defaultInterval.5//默認時間間隔

@interfaceUIControl?(UIControl_buttonCon)

@property(nonatomic,assign)NSTimeIntervaltimeInterval;//用這個給重復點擊加間隔

@property(nonatomic,assign)BOOLisIgnoreEvent;//YES不允許點擊NO允許點擊

@end

.m文件

#import"UIControl+UIControl_buttonCon.h"

@implementationUIControl?(UIControl_buttonCon)

-?(NSTimeInterval)timeInterval{

return[objc_getAssociatedObject(self,_cmd)doubleValue];

}

-?(void)setTimeInterval:(NSTimeInterval)timeInterval{

objc_setAssociatedObject(self,@selector(timeInterval),@(timeInterval),OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

//runtime動態綁定屬性

-?(void)setIsIgnoreEvent:(BOOL)isIgnoreEvent{

objc_setAssociatedObject(self,@selector(isIgnoreEvent),@(isIgnoreEvent),OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

-?(BOOL)isIgnoreEvent{

return[objc_getAssociatedObject(self,_cmd)boolValue];

}

-?(void)resetState{

[selfsetIsIgnoreEvent:NO];

}

+?(void)load{

staticdispatch_once_tonceToken;

dispatch_once(&onceToken,?^{

SELselA?=@selector(sendAction:to:forEvent:);

SELselB?=@selector(mySendAction:to:forEvent:);

MethodmethodA?=class_getInstanceMethod(self,?selA);

MethodmethodB?=class_getInstanceMethod(self,?selB);

//將methodB的實現添加到系統方法中也就是說將methodA方法指針添加成方法methodB的返回值表示是否添加成功

BOOLisAdd?=class_addMethod(self,?selA,method_getImplementation(methodB),method_getTypeEncoding(methodB));

//添加成功了說明本類中不存在methodB所以此時必須將方法b的實現指針換成方法A的,否則b方法將沒有實現。

if(isAdd)?{

class_replaceMethod(self,?selB,method_getImplementation(methodA),method_getTypeEncoding(methodA));

}else{

//添加失敗了說明本類中有methodB的實現,此時只需要將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;

}elseif(self.timeInterval>0){

[selfperformSelector:@selector(resetState)withObject:nilafterDelay:self.timeInterval];

}

}

//此處methodA和methodB方法IMP互換了,實際上執行sendAction;所以不會死循環

self.isIgnoreEvent=YES;

[selfmySendAction:actionto:targetforEvent:event];

}

@end


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

推薦閱讀更多精彩內容