美文网首页iOS Developer - TipsiOS 技术文集iOS开发笔录
button防止被重复点击的相关方法(详细版)

button防止被重复点击的相关方法(详细版)

作者: 信仰支撑我不会痛 | 来源:发表于2016-06-15 11:41 被阅读3984次

我的git地址:https://github.com/smileshang/simpleTools.git
包含了多个自己总结出来的工具类,喜欢的给个star,谢谢。
一、避免屏幕内多个button被同时点击

1、在AppDelegate中添加 [[UIButton appearance] setExclusiveTouch:YES];

2、或者每新建button都设置button.exclusiveTouch = YES;

二、避免一个button被多次点击(共总结了3种)

第一种:使用runtime,一劳永逸 我这设的是0.5秒内不会被重复点击

1、导入objc/runtime.h(我放在了pch文件里)

2、创建uicontrol或uibutton的分类,(what?!! 你告诉我不会?!)

创建分类文件:1、打开Xcode,新建文件,选择OC文件

1.png

2、在第二个界面,将file Type 选为 Category类,在class里选继承的类别,这里咱们选的是UIcontrol

2.png

注:control类是对所有button的点击事件反应,若用Unbutton类,则只会对Unbutton创建的button反应。

3、好了 分类创建完毕 对分类进行操作

1、.h文件 这里只贴图,最后放代码们

3.png

2、.m文件

4.png 5.png

最后是代码们


#import

#define defaultInterval.5//默认时间间隔

@interfaceUIControl (UIControl_buttonCon)

@property(nonatomic,assign)NSTimeIntervaltimeInterval;//用这个给重复点击加间隔

@property(nonatomic,assign)BOOLisIgnoreEvent;//YES不允许点击NO允许点击

@end

#import"UIControl+UIControl_buttonCon.h"

@implementationUIControl (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{

[selfsetIsIgnoreEvent:NO];

}

+ (void)load{

staticdispatch_once_tonceToken;

dispatch_once(&onceToken, ^{

SELselA =@selector(sendAction:to:forEvent:);

SELselB =@selector(mySendAction:to:forEvent:);

MethodmethodA =class_getInstanceMethod(self, selA);

MethodmethodB =class_getInstanceMethod(self, selB);

//将methodB的实现添加到系统方法中也就是说将methodA方法指针添加成方法methodB的返回值表示是否添加成功

BOOLisAdd =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;

}elseif(self.timeInterval>0){

[selfperformSelector:@selector(resetState)withObject:nilafterDelay:self.timeInterval];

}

}

//此处methodA和methodB方法IMP互换了,实际上执行sendAction;所以不会死循环

self.isIgnoreEvent=YES;

[selfmySendAction:actionto:targetforEvent:event];

}

@end

第二种:在每次点击时先取消之前的操作

将这段代码放在你按钮点击的方法中,例如:

- (void)buttonClicked:(id)sender

{

//点击按钮后先取消之前的操作,再进行需要进行的操作

[[selfclass]cancelPreviousPerformRequestsWithTarget:selfselector:@selector(buttonClicked:)object:sender];

[selfperformSelector:@selector(buttonClicked: )withObject:senderafterDelay:0.2f];

}

第三种:点击后设为不可被点击的状态,几秒后恢复

-(void)buttonClicked:(id)sender{

self.button.enabled =NO;

[selfperformSelector:@selector(changeButtonStatus)withObject:nilafterDelay:1.0f];//防止重复点击

}

-(void)changeButtonStatus{

self.button.enabled =YES;

}

相关文章

网友评论

  • lesmiserables0:第一种方法在小demo中可行,在项目中,imageTitleButton是继承自UIButton的子类。设置timeInterval之后,没有效果。
  • 我是帅帅唐僧:我用开发中测试没有出现问题 但是打包hoc版本 点击一次后不能再次点击 非常奇怪
  • 标准答案:为什么我用你的第二个情形下的第二种方法会重复执行button的点击事件的那个方法
  • 醉酒肆之:不是Android的啊,也不在标题写出来👎
    guitarJason:@醉酒肆之 像你这种伸手党也真是罪过
  • _铁马冰河_:用了这个运行时防止点击多次的话,如果有拍照功能,拍照的按钮会受到影响,不能拍照 应该!
    _铁马冰河_:@信仰支撑我不会痛 哦 你那有一个判断它的类是按钮的方法,你介不介意再试下把一个按钮绑定多个手势,你看能不能点击?
    信仰支撑我不会痛:@九零狗 我写完了test,调用系统的imagePicker,对于拍照并没有任何影响,你看看是不是自己代码那地方有不对的地方,代理设置正确了么?
    信仰支撑我不会痛:@九零狗 请问你是碰到了这种情况吗? 目前我还没有遇到说点击之后没有反应的情况,我写个test测试一下。
  • 酷哥不回头看爆炸:我能这样理解吗?限制同一个被重复点击的时候,就是第一种添加类目的方法可以限制项目中所有的contron类。另外两种是限制当前做处理的。是吧?
    信仰支撑我不会痛:嗯,第一种control类的话是从根本上去改变响应时间,剩下两种每个button都要设置一遍,各有各的好处吧,第一种是简单一步搞定,可是遇到手机卡,反应时间长的话也会被重复点击。
  • 418ac3f97e4b:给力,涨姿势了
    信仰支撑我不会痛:@小妖游子 大家一起进步:stuck_out_tongue_closed_eyes:
  • 东方_未明:非常不错, 学习了
    信仰支撑我不会痛:@东方_未明 谢谢,大家共同进步!

本文标题:button防止被重复点击的相关方法(详细版)

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