搭建一个网站多少钱哈尔滨电脑,南京网站设计哪家公司好,佛山搜索seo网络推广,做好网站建设最近测试老跑过来提bug#xff0c;说按钮可以点好几次#xff0c;然后蹦出来好几个一样的界面出来#xff0c;解决了一个地方#xff0c;其他地方也会冒出一样的问题来#xff0c;仔细一想#xff0c;还是要从根本上解决问题#xff0c;于是想了几个方法#xff1a;1.添…最近测试老跑过来提bug说按钮可以点好几次然后蹦出来好几个一样的界面出来解决了一个地方其他地方也会冒出一样的问题来仔细一想还是要从根本上解决问题于是想了几个方法1.添加UIButton分类重写-(BOOL)isTouchInside方法让按钮在点击了一次之后的0.2s(可设置)之内变成不可点击状态#import UIButtonBK.himplementation UIButton (BK)-(BOOL)isTouchInside{self.enabled NO;dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{self.enabled YES;});return YES;}end这种做法很简单粗暴而且亲测有效唯一的缺点就是在按钮点击之后的0.2s内按钮状态是不可点击状态的(灰色)虽说0.2s很短但是追求极致体验的程序员肯定不会允许这种情况发生对吧 : ) 于是想到了另外一种方法2.还是添加UIButton分类利用runtime运行时机制让按钮点击之后的短时间内不再响应此事件废话不多说show me the code//// UIButtonBK.h// BMKP//// Created by 演员新之助 on 16/9/5.// Copyright © 2016年 Bmkp. All rights reserved.//#import #define defaultInterval 0.5//默认时间间隔interface UIButton (BK)property(nonatomic,assign)NSTimeInterval timeInterval;//用这个给重复点击加间隔property(nonatomic,assign)BOOL isIgnoreEvent;//YES不允许点击NO允许点击end---------------------------我是可爱的分割线--------------------------//// UIButtonBK.m// BMKP//// Created by 演员新之助 on 16/9/5.// Copyright © 2016年 Bmkp. All rights reserved.//#import UIButtonBK.himplementation UIButton (BK)-(BOOL)isTouchInside{// self.enabled NO;// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{// self.enabled YES;// });funclogreturn YES;}- (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{//注意BOOL类型需要用OBJC_ASSOCIATION_RETAIN_NONATOMIC不要用错否则set方法会赋值出错objc_setAssociatedObject(self,selector(isIgnoreEvent),(isIgnoreEvent),OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (BOOL)isIgnoreEvent{//_cmd select(isIgnore);和set方法里一致return[objc_getAssociatedObject(self,_cmd)boolValue];}- (void)resetState{[self setIsIgnoreEvent:NO];} (void)load{static dispatch_once_t onceToken;dispatch_once(onceToken, ^{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);}});}//当我们按钮点击事件sendAction时将会执行mySendAction- (void)mySendAction:(SEL)action to:(id)target forEvent:(UIEvent*)event{if([self isKindOfClass:[UIButton class]]) {self.timeIntervalself.timeInterval0?defaultInterval:self.timeInterval;if(self.isIgnoreEvent){return;}else if(self.timeInterval0){[self performSelector:selector(resetState)withObject:nil afterDelay:self.timeInterval];}}//此处methodA和methodB方法IMP互换了实际上执行sendAction所以不会死循环self.isIgnoreEventYES;[self mySendAction:action to:target forEvent:event];}end这样就完美解决的按钮重复点击的问题亲测有效如果大家有更简便的方法欢迎交流 : )