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

转载 2016年08月30日 11:07:51


作者:ocarol

原文链接:http://www.jianshu.com/p/65ce6471cd0f


场景


当app有点卡的时候,多次点击相同的button,经常出现,跳转了N次相同的界面(比如闲鱼)


解决办法


用运行时和分类,替换UIControl响应事件,根据响应的间隔时间来判断是否执行事件。


详细步骤


1. 创建一个UIControl的分类




为了方便他人调整不同的间隔时间需求,在UIControl+Custom.h文件中开放间隔时间属性,UIControl+Custom.h文件的代码为:


//  UIControl+Custom.h

//  Created by ocarol on 16/8/16.

//  Copyright ? 2016年 ocarol. All rights reserved.

//

#import <UIKit/UIKit.h>

@interface UIControl (Custom)

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

@end


在UIControl+Custom.m文件中实现方法交换(妥善的做法是:先添加方法,如果方法已经存在,就替换原方法),在UIControl+Custom.m文件的代码为:


//  UIControl+Custom.m

//  Created by ocarol on 16/8/16.

//  Copyright ? 2016年 ocarol. All rights reserved.

//

#import "UIControl+custom.h"

#import <objc/runtime.h>

@interface UIControl()

@property (nonatomic, assign) NSTimeInterval custom_acceptEventTime;

@end

@implementation UIControl (Custom)

+ (void)load{

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

SEL sysSEL = @selector(sendAction:to:forEvent:);

Method customMethod = class_getInstanceMethod(self, @selector(custom_sendAction:to:forEvent:));

SEL customSEL = @selector(custom_sendAction:to:forEvent:);

//添加方法 语法:BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types) 若添加成功则返回No

// cls:被添加方法的类  name:被添加方法方法名  imp:被添加方法的实现函数  types:被添加方法的实现函数的返回值类型和参数类型的字符串

BOOL didAddMethod = class_addMethod(self, sysSEL, method_getImplementation(customMethod), method_getTypeEncoding(customMethod));

//如果系统中该方法已经存在了,则替换系统的方法  语法:IMP class_replaceMethod(Class cls, SEL name, IMP imp,const char *types)

if (didAddMethod) {

class_replaceMethod(self, customSEL, method_getImplementation(systemMethod), method_getTypeEncoding(systemMethod));

}else{

method_exchangeImplementations(systemMethod, customMethod);

}

}

- (NSTimeInterval )custom_acceptEventInterval{

return [objc_getAssociatedObject(self, "UIControl_acceptEventInterval") doubleValue];

}

- (void)setCustom_acceptEventInterval:(NSTimeInterval)custom_acceptEventInterval{

objc_setAssociatedObject(self, "UIControl_acceptEventInterval", @(custom_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

- (NSTimeInterval )custom_acceptEventTime{

return [objc_getAssociatedObject(self, "UIControl_acceptEventTime") doubleValue];

}

- (void)setCustom_acceptEventTime:(NSTimeInterval)custom_acceptEventTime{

objc_setAssociatedObject(self, "UIControl_acceptEventTime", @(custom_acceptEventTime), OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

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

// 如果想要设置统一的间隔时间,可以在此处加上以下几句

// 值得提醒一下:如果这里设置了统一的时间间隔,会影响UISwitch,如果想统一设置,又不想影响UISwitch,建议将UIControl分类,改成UIButton分类,实现方法是一样的

// if (self.custom_acceptEventInterval <= 0) {

//     // 如果没有自定义时间间隔,则默认为2秒

//    self.custom_acceptEventInterval = 2;

// }

// 是否小于设定的时间间隔

BOOL needSendAction = (NSDate.date.timeIntervalSince1970 - self.custom_acceptEventTime >= self.custom_acceptEventInterval);

// 更新上一次点击时间戳

if (self.custom_acceptEventInterval > 0) {

self.custom_acceptEventTime = NSDate.date.timeIntervalSince1970;

}

// 两次点击的时间间隔小于设定的时间间隔时,才执行响应事件

if (needSendAction) {

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

}

}

@end


扩展阅读:

Objective-C Runtime Reference - Apple Developer
Objective C运行时(runtime)技术的几个要点总结
OC运行时编程指南
Method Swizzling

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

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

ios避免button多次连续点击跳转到多个页面

说明:这个代码我是网上找来的,忘记了出处了,抱歉 1、创建一个名称为Click的button分类 UIbutton+Click.h#import @interface UIButton (WXD)...
  • hyczwl
  • hyczwl
  • 2017年06月26日 09:47
  • 521

iOS开发~防止navigation多次push一个页面

在点击push下一个页面时,因为各种原因,点一下cell或按钮没有响应,用户可能就多点几下,这时候会打开好几个一样的页面。 这是因为push后的页面有耗时操作或者刚好push到另一个页面时,另一个页...
  • lizhilin_vip
  • lizhilin_vip
  • 2016年06月29日 09:28
  • 3949

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

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

iOS之a按钮重复点击的问题、cell重复点击的问题

1.=====网络请求时,按钮重复点击的问题== 存在网络请求的按钮事件, 这种事件应该在开发中是经常遇到的,  例如:登录按钮事件,如果我们快速多次点击按钮, 会不会多次触发登录请求?第一次登录...
  • u011146511
  • u011146511
  • 2017年07月20日 10:02
  • 489

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

作者:ocarol 原文链接:http://www.jianshu.com/p/65ce6471cd0f 场景 当app有点卡的时候,多次点击相同的but...
  • xiaohe901216
  • xiaohe901216
  • 2016年08月30日 11:07
  • 648

ios中解决UIButton连续重复点击按钮的Bug方法

iOS开发中会遇到一个按钮快速点击了多次后弹出多个视图出现的bug,可以通过以下方法解决。 - (IBAction)processButton:(UIButton *)sender {  ...
  • COOL_BEAR_XX
  • COOL_BEAR_XX
  • 2015年05月08日 16:36
  • 1382

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

场景 当app有点卡的时候,多次点击相同的button,经常出现,跳转了N次相同的界面(比如闲鱼) 解决办法 用运行时和分类,替换UIControl响应事件,根据响应的间隔时间来判断是否执行事件...
  • qq_30600895
  • qq_30600895
  • 2016年08月26日 14:40
  • 432

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

场景 当app有点卡的时候,多次点击相同的button,经常出现,跳转了N次相同的界面(比如闲鱼) 解决办法 用运行时和分类,替换 UIControl 响应事件,根据响应的间隔时间来判断是否执行...
  • zzzzzdddddxxxxx
  • zzzzzdddddxxxxx
  • 2016年11月23日 15:15
  • 261

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

iOS小技巧–用runtime 解决UIButton 重复点击问题 什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题.  通常是如何...
  • yuanchunzi
  • yuanchunzi
  • 2015年09月11日 16:37
  • 422
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS- 利用runtime,解决多次点击相同button,导致重复跳转的问题
举报原因:
原因补充:

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