//? Created by ming on 2017/4/10.//? Copyright ? 2017年 wode. All rights reserved.//#import#import#define defaultInter 2//默認時間間隔
@interface UIButton (UIControl_button)
@property (nonatomic,assign)NSTimeInterval timerInterVal;// 用這個重復點擊加時間隔
@property (nonatomic,assign)BOOL isSelect; //YES不允許點擊 no運行點擊
@end
//
//? UIButton+UIControl_button.m
//
//? Created by ming on 2017/4/10.
//? Copyright ? 2017年 wode. All rights reserved.
//
/*runTime*/
#import "UIButton+UIControl_button.h"
@implementation UIButton (UIControl_button)
-(NSTimeInterval)timerInterVal
{
return [objc_getAssociatedObject(self, _cmd)doubleValue];
}
-(void)setTimerInterVal:(NSTimeInterval)timerInterVal
{
objc_setAssociatedObject(self, @selector(timerInterVal), @(timerInterVal), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
//runtime 動態綁定 屬性
-(void)setIsSelect:(BOOL)isSelect
{
//注意bool類型 需要用OBJC_ASSOCIATION_RETAIN_NONATOMIC 不要用錯,否則set方法會賦值出錯
objc_setAssociatedObject(self, @selector(isSelect), @(isSelect), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
//get方法
-(BOOL)isSelect
{
//_cmd ==@select(isSelect);和set方法一致
return [objc_getAssociatedObject(self, _cmd)boolValue];
}
- (void)resetState{
[self setIsSelect:NO];
}
+(void)load
{
//單利
static dispatch_once_t onceToken;
_dispatch_once(&onceToken, ^{
SEL selA = @selector(sendAction:to:forEvent:);
SEL selB = @selector(mySendAction:to:forEvent:);
/*
class_getMethodImplementation(<#__unsafe_unretained Class cls#>, <#SEL name#>) 獲取實現方法(IMP實現方法)
class_getClassMethod? :獲取類方法
class_getInstanceMethod: 獲取對象方法
*/
Method methodA =class_getInstanceMethod(self, selA);
Method methodB =class_getInstanceMethod(self, selB);
//講 methodB 的實現 添加到系統方法中? 也就是說 講 methodA方法指針添加成 方法methodB? 返回值表示是否添加成功
BOOL isAdd = 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 和methodBDE IMP互換一下即可.
method_exchangeImplementations(methodA, methodB);
}
});
NSLog(@"+load方法");
}
//當我們按鈕點擊執行時間 sendAction 時,將會執行mySendAction
-(void)mySendAction:(SEL)action to:(id)target forEvent:(UIEvent*)event
{
if ([NSStringFromClass(self.class)isEqualToString:@"UIButton"]) {
self.timerInterVal = self.timerInterVal==0?defaultInter:self.timerInterVal;
if (self.isSelect) {
return;
}else if (self.timerInterVal>0){
[self performSelector:@selector(resetState) withObject:nil afterDelay:self.timerInterVal];
}
}
//此處 methodA和 methodB方法IMP互換了,實際上執行sendAciont:所以不會死循環.
self.isSelect = YES;
[self mySendAction:action to:target forEvent:event];
}