ios 如何防止Button被重復多次點擊的幾種方法

demo地址:?https://github.com/HeYunDong/ButtonMCK


button被暴力點擊這個問題、我相信很多人都遇到過、現在整理下資料供大家參考!

這里有如下3個方法:

1、使用runtime 機制來解決這個問題;給Button添加一個類別;(Objective-C 利用 Runtime 運行時變成一門動態語言,在開發過程中,使用 Runtime 相關 API 可以實現一些很強大的功能,這里我們簡單講到使用 Runtime 完成為分類增加偽屬性、利用 Method SWizzling 來 Hook 方法、實現 NSCoding 自動歸檔解檔、實現 KVO Block、委托等!)

#import

NS_ASSUME_NONNULL_BEGIN

@interfaceUIButton (More)

/**

?設置點擊的時間間隔

?*/

@property(nonatomic,assign)NSTimeIntervaleventTimeInterval;

@end

NS_ASSUME_NONNULL_END




#import "UIButton+More.h"

#import

#define defaultInterval1? //默認時間間隔

@interface UIButton ()

//點擊事件

@property (nonatomic, assign) BOOL isIgnoreEvent;

@end

@implementationUIButton (More)

staticconstchar*He_eventTimeInterval ="He_eventTimeInterval";

staticconstchar*He_enventIsIgnoreEvent ="He_enventIsIgnoreEvent";

// runtime 動態綁定 屬性

- (void)setIsIgnoreEvent:(BOOL)isIgnoreEvent

{

? ? objc_setAssociatedObject(self, He_enventIsIgnoreEvent, @(isIgnoreEvent), OBJC_ASSOCIATION_ASSIGN);

}

- (BOOL)isIgnoreEvent{

? ? return [objc_getAssociatedObject(self, He_enventIsIgnoreEvent) boolValue];

}

- (NSTimeInterval)eventTimeInterval

{

? ? return [objc_getAssociatedObject(self, He_eventTimeInterval) doubleValue];

}

- (void)setEventTimeInterval:(NSTimeInterval)eventTimeInterval

{

? ? objc_setAssociatedObject(self, He_eventTimeInterval, @(eventTimeInterval), OBJC_ASSOCIATION_ASSIGN);

}

+ (void)load

{

? ? // Method Swizzling

? ? staticdispatch_once_tonceToken;

? ? dispatch_once(&onceToken, ^{

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

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

? ? ? ? Method methodA = class_getInstanceMethod(self,selA);

? ? ? ? Method methodB = class_getInstanceMethod(self, selB);


? ? ? ? method_exchangeImplementations(methodA, methodB);


? ? });

}

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

{



? ? if(self.isIgnoreEvent==NO) {

? ? ? ? self.isIgnoreEvent = YES;

? ? ? ? [selfhe_sendAction:actionto:targetforEvent:event];

//? ? ? ? [self performSelector:@selector(setIsIgnoreEvent:) withObject:@(NO) afterDelay:self.eventTimeInterval];

? ? /**或者用下方法*/

? ? dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.eventTimeInterval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

? ? ? ? [self setIsIgnoreEvent:NO];

? ? });

? ? }

}

@end



2、給點擊方法里設置延遲

-(void)testChlickoneone:(UIButton* )sender{


? ? sender.enabled=NO;

? ? NSLog(@"====點擊=one==========1");

? ? dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(defaultInterval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

? ? ? ? sender.enabled=YES;

? ? });

}


3、方法


// *? 取消延遲執行

// *

// *? @param aTarget? ? 一般填self

// *? @param aSelector? 延遲執行的方法

// *? @param anArgument 設置延遲執行時填寫的參數(必須和上面performSelector方法中的參數一樣)

// cancelPreviousPerformRequestsWithTarget? 注意

-(void)testChlicktwo:(UIButton* )sender{

? ? NSLog(@"====點擊=two==========2");

? ? [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(buttonClickedAction:) object:sender];

? ? [selfperformSelector:@selector(buttonClickedAction:)withObject:senderafterDelay:defaultInterval];

}

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

推薦閱讀更多精彩內容