iOS开发 防止button快速点击
来源:互联网 发布:淘宝哪家mcm高仿比较好 编辑:程序博客网 时间:2024/06/10 20:05
/*
** 防止button快速点击Method
*/
@interface UIButton (touch)
/**设置点击时间间隔,默认0.5S*/
@property (nonatomic,assign) NSTimeInterval timeInterval;
/**
* 用于设置单个按钮不需要被hook,忽略YES
*/
@property (nonatomic,assign) BOOL isIgnore;
@end
#define defaultInterval .5 //默认时间间隔
@interface UIButton()
/**bool 类型 YES不允许点击 NO允许点击 设置是否执行点UI方法*/
@property (nonatomic,assign) BOOL isIgnoreEvent;
@end
@implementation UIButton (touch)
+ (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);
}
});
}
- (NSTimeInterval)timeInterval{
return [objc_getAssociatedObject(self,_cmd) doubleValue];
}
- (void)setTimeInterval:(NSTimeInterval)timeInterval{
objc_setAssociatedObject(self,@selector(timeInterval), @(timeInterval),OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
//当我们按钮点击事件 sendAction时 将会执行 mySendAction
- (void)mySendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event{
if (self.isIgnore) {
//不需要被hook
[self mySendAction:actionto:target forEvent:event];
return;
}
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:nilafterDelay:self.timeInterval];
}
}
//此处 methodA和methodB方法IMP互换了,实际上执行 sendAction;所以不会死循环
self.isIgnoreEvent =YES;
[self mySendAction:actionto:target forEvent:event];
}
//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)setIsIgnore:(BOOL)isIgnore{
// 注意BOOL类型需要用OBJC_ASSOCIATION_RETAIN_NONATOMIC不要用错,否则set方法会赋值出错
objc_setAssociatedObject(self,@selector(isIgnore), @(isIgnore),OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (BOOL)isIgnore{
//_cmd == @select(isIgnore); 和set方法里一致
return [objc_getAssociatedObject(self,_cmd) boolValue];
}
- (void)resetState{
[self setIsIgnoreEvent:NO];
}
@end
- iOS开发 防止button快速点击
- [IOS 开发] 防止button被点击多次
- IOS 防止button重复点击
- iOS防止Button连续点击
- Android、 Button 防止快速点击问题
- iOS开发:button不能点击
- 防止快速连续点击button多次执行相同操作
- 防止button连续点击
- iOS,页面内button防止同时点击的解决方案
- android Button防止多次点击
- 防止Button的频繁点击
- iOS 防止UITableViewCell快速重复点击多次响应事件
- IOS Button 模拟点击
- iOS开发 防止UIButton,cell等重复点击
- Android 防止button多次点击总结
- Android 防止快速 点击 多次
- Android防止快速重复点击
- android 防止快速点击问题
- svn工具——菜单项功能备注
- Android 四种布局方式详解
- Android中的各种button
- 实现用户注册与登录、登出(三)
- java读取配置文件的方法
- iOS开发 防止button快速点击
- ELK日志分析系统搭建
- 套接字与FIFO
- Linux--搭建postfix邮件服务器
- JProfiler入门教程-简单的java程序性能调优
- 在Linux系统Centos6.9安装locate命令
- html注册失败跳转页面
- 序列化与反序列化
- Qt线程之间通过signal和slot传递数据