用runtime 解决UIButton 重复点击问题

原创 2017年01月03日 13:57:35

可以给按钮添加一个属性重复点击间隔, 通过设置这个属性来控制再次接受点击事件的时间间隔。

@interface UIControl (EventInterval)

// 可以用这个给重复点击加间隔
@property (nonatomic, assign) NSTimeInterval hyn_acceptEventInterval;
@property (nonatomic, assign) BOOL hyn_ignoreEvent;//
@end

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);
}

在app启动的时候,我们hook 所有的按钮的 event

@implementation UIControl (EventInterval)

+ (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];
}

实际使用起来就是这样

UIButton *tempBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[tempBtn addTarget:self action:@selector(btn_click:) forControlEvents:UIControlEventTouchUpInside];
tempBtn.hyn_acceptEventInterval = 0.5;

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

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

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

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

用Runtime解决UIButton重复点击问题

用Runtime解决UIButton重复点击问题        通常我们在项目中会遇到这样的问题,点击一个button触发一个事件,但总是会遇到连点的问题,如果是动画,连点会让你的动...
  • hypercode
  • hypercode
  • 2016年08月30日 16:12
  • 439

小技巧之-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
  • 355

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

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

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

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

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

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

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

什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题. 通常是如何解决 我们通常会在按钮点击的时候设置这个按钮不可点击. 等...
  • zhaojian3513012
  • zhaojian3513012
  • 2016年01月19日 16:15
  • 334
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用runtime 解决UIButton 重复点击问题
举报原因:
原因补充:

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