用Runtime解决UIButton重复点击问题

转载 2016年08月30日 16:12:55

用Runtime解决UIButton重复点击问题

       通常我们在项目中会遇到这样的问题,点击一个button触发一个事件,但总是会遇到连点的问题,如果是动画,连点会让你的动画出现意想不到的情况。我在之前的项目中也遇到过类似的情况,上网搜过很多解决方法,但都没有得到想要解决方案。前几天在cocoachina一篇文章中得到启发,自己写了一Demo共享给大家。废话不多说先上图,没图说个jiba .

       


两个button的点击事件完全相同,都是让红色的view的中心点从(25,89)到(200,500)但很明显没做控制的button在多次点击的情况下动画不是我们想要的效果。

再上代码

@interface UIControl (YN)

@property (nonatomic, assign) NSTimeInterval hyn_acceptEventInterval;//添加点击事件的间隔事件

@property (nonatomic, assign) BOOL hyn_ignoreEvent;//

@end


#import@implementation UIControl (YN)

static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";

static const char *UIcontrol_ignoreEvent = "UIcontrol_ignoreEvent";

- (NSTimeInterval)hyn_acceptEventInterval {

return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];

}

- (void)setHyn_acceptEventInterval:(NSTimeInterval)hyn_acceptEventInterval {

objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(hyn_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

- (BOOL)hyn_ignoreEvent {

return [objc_getAssociatedObject(self, UIcontrol_ignoreEvent) boolValue];

}

- (void)setHyn_ignoreEvent:(BOOL)hyn_ignoreEvent {

objc_setAssociatedObject(self, UIcontrol_ignoreEvent, @(hyn_ignoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

+ (void)load {

Method a = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));

Method b = class_getInstanceMethod(self, @selector(__hyn_sendAction:to:forEvent:));

method_exchangeImplementations(a, b);

}

- (void)__hyn_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {

if (self.hyn_ignoreEvent) return;

if (self.hyn_acceptEventInterval > 0) {

self.hyn_ignoreEvent = YES;

[self performSelector:@selector(setHyn_ignoreEvent:) withObject:@(NO) afterDelay:self.hyn_acceptEventInterval];

}

[self __hyn_sendAction:action to:target forEvent:event];

}

@end


使用:

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIButton *button;//用Runtime做控制的button

@property (weak, nonatomic) IBOutlet UIView *colorView;//红色的view

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

//设置一个延迟时间,为了方便观察我这里把动画设置成三秒

self.button.hyn_acceptEventInterval = 3;

}

//Runtime控制的button点击事件

- (IBAction)runtimeAction:(UIButton *)sender {

[UIView animateWithDuration:3 animations:^{

self.colorView.center = CGPointMake(200, 500);

} completion:^(BOOL finished) {

self.colorView.center = CGPointMake(25, 89);

}];

}

//普通的buttonAction

- (IBAction)buttonAction:(UIButton *)sender {

[UIView animateWithDuration:3 animations:^{

self.colorView.center = CGPointMake(200, 500);

} completion:^(BOOL finished) {

self.colorView.center = CGPointMake(25, 89);

}];

}

@end

为了方便看代码截个图,这年头没图就是没把发说事



你还在一个一个单独控制多次点击吗?采用Runtime的方法,让你简单到1行代码解决重复点击问题

self.button.hyn_acceptEventInterval = 0.xx;

就是那么简单。

文章灵感来自Cocoachina 

iOS之使用Runtime解决UIButton多次点击(重复点击)

在实际开发中我们,点击一个button按键时,需要触发一个事件去执行。用户在正常操作情况下,单次点击时,button只会响应一次点击。但是如果用户多次点击一个button,那么就会引起这个事件被多次执...
  • wzc10101415
  • wzc10101415
  • 2016年08月10日 13:35
  • 818

iOS开发- 利用runtime拦截UIButton的点击事件,防止重复点击

应用场景:对于公司原来的一些代码,想对UIButton的点击事件做一部分修改,但是如果使用继承出来的UIBtton来解决的话, 又要改大量的代码,这时候,使用runtime拦截替换发送点击事件的方法可...
  • wqt925497045
  • wqt925497045
  • 2016年07月02日 18:52
  • 1159

小技巧之-runtime 解决 UIButton 重复点击问题

什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题。 通常是如何解决 我们通常会在按钮点击的时候设置这个按钮不可点击. 等...
  • CatStarXcode
  • CatStarXcode
  • 2016年01月16日 15:17
  • 245

用runtime 解决UIButton 重复点击问题

iOS小技巧–用runtime 解决UIButton 重复点击问题
  • wsjshx
  • wsjshx
  • 2016年01月07日 21:59
  • 397

利用Runtime来拦截UIButton的点击事件,防止重复点击

对于公司原来的一些代码,想对UIButton的点击事件做一部分修改,但是如果使用继承出来的UIBtton来解决的话, 又要改大量的代码,这时候,使用runtime拦截替换发送点击事件的方法可以迅速解决...
  • Jason_WangYing
  • Jason_WangYing
  • 2017年03月27日 16:29
  • 354

iOS---防止UIButton重复点击的三种实现方式

通常, 我们会采用如下的一些措施来防止重复点击UIButton:使用UIButton的enabled或userInteractionEnabled使用UIButton的enabled属性, 在点击后,...
  • icetime17
  • icetime17
  • 2016年06月29日 14:39
  • 5336

iOS小技巧--用runtime 解决UIButton 重复点击问题

iOS小技巧–用runtime 解决UIButton 重复点击问题什么是这个问题我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题. 通常是如何解决我们通常...
  • uxyheaven
  • uxyheaven
  • 2015年08月26日 20:05
  • 13781

iOS 防止UIButton 连续点击导致请求多次的问题!

在项目中,很多逻辑请求都需要用到UIButton 做点击事件进行相关跳转或数据请求等!可以说是在项目中最常用的一种控件,但是有些细节上的处理还是我们要多注意的,比如我们今天说的连续点击UIButton...
  • u012890071
  • u012890071
  • 2016年12月09日 14:41
  • 1050

iOS小技巧–用runtime 解决UIButton 重复点击问题

什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题. 通常是如何解决 我们通常会在按钮点击的时候设置这个按钮不可点击. 等...
  • zhaojian3513012
  • zhaojian3513012
  • 2016年01月19日 16:15
  • 332

iOS- 利用runtime,解决多次点击相同button,导致重复跳转的问题

作者:ocarol 原文链接:http://www.jianshu.com/p/65ce6471cd0f 场景 当app有点卡的时候,多次点击相同的but...
  • xiaohe901216
  • xiaohe901216
  • 2016年08月30日 11:07
  • 600
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Runtime解决UIButton重复点击问题
举报原因:
原因补充:

(最多只允许输入30个字)