美文网首页
runtime按钮重复点击

runtime按钮重复点击

作者: yaoyao_IOS | 来源:发表于2017-11-08 19:41 被阅读5次

1.导入objc / runtime.h(可以放在PCH文件里)
2.创建uicontrol或UIButton的的分类!

#import <UIKit/UIKit.h>
#define defaultInterval .5//默认时间间隔

@interface UIControl (UIControl_buttonCon)

@property(nonatomic,assign)NSTimeInterval timeInterval;//用这个给重复点击加间隔
@property(nonatomic,assign)BOOL isIgnoreEvent;//YES不允许点击NO允许点击
@end
#import "UIControl+UIControl_buttonCon.h"

@implementation UIControl (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{
    
    [self setIsIgnoreEvent:NO];
}

+ (void)load{
    
    static dispatch_once_t _tonceToken;
    
    dispatch_once(&_tonceToken, ^{
        
        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的实现添加到系统方法中也就是说将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和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互换了,实际上执行sendAction;所以不会死循环
    self.isIgnoreEvent=YES;
    [self mySendAction:action to:target forEvent:event];
}

或者

- (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按钮重复点击

      本文链接:https://www.haomeiwen.com/subject/senymxtx.html