用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;

相关文章推荐

完全解决快速连续多次点击button导致跳转多个界面(注:方法从他人博客中看到,稍作修改)

在实际开发过程中,由于我们在点击一个button后进行网络请求,然后进行页面的跳转,但是当网络较慢,但是一直连续点击button,造成跳转一个页面多次,虽有通过button的enable可以稍作解决,...

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

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

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

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

用runtime 解决UIButton 重复点击问题

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

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

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

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

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

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

作者:ocarol 原文链接:http://www.jianshu.com/p/65ce6471cd0f 场景 当app有点卡的时候,多次点击相同的but...

iOS runtime扩大UIButton点击范围

我们知道C代码一般经过预处理、编译、链接、运行然后在平台上跑起来,Objective-C是基于C加入了面向对象和消息转发的动态语言,所以除了需要一个编译器外,还需runtime系统来动态创建类和对象。...

runtime - UIButton点击事件重复处理

原理,写一个UIButton的分类: 为分类添加一个属性表示控制两次按钮点击事件触发的时间间隔。 修改UIControl点击事件方法的实现过程,修改按钮的是否可交互行为。 代码:....

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

通常, 我们会采用如下的一些措施来防止重复点击UIButton:使用UIButton的enabled或userInteractionEnabled使用UIButton的enabled属性, 在点击后,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用runtime 解决UIButton 重复点击问题
举报原因:
原因补充:

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