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];
}