博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[iOS]利用runtime,解决多次点击相同button,导致重复跳转的问题
阅读量:6581 次
发布时间:2019-06-24

本文共 3285 字,大约阅读时间需要 10 分钟。

##场景 当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 
@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 
@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复制代码

###扩展阅读:

转载地址:http://xcino.baihongyu.com/

你可能感兴趣的文章
ecshop修改用户登录成功和退出成功的提示页面信息
查看>>
C Cheat Sheet
查看>>
log4j:ERROR Could not read configuration file [log4j.properties].
查看>>
图像处理经典图片Lena背后的故事
查看>>
NSData
查看>>
Design Pattern - 7原则
查看>>
[译] wxWidgets - wxDir
查看>>
gjrand 4.0.1 发布,伪随机数生成器
查看>>
每天一个linux命令(53):route命令
查看>>
使用反射获取Android中隐藏的方法
查看>>
PHP开发者常犯的10个MySQL错误
查看>>
计算图像相似度——《Python也可以》之一(转)
查看>>
Go编程语言规范2-类型
查看>>
对比shrink和move
查看>>
C# Compiler Options
查看>>
Linux学习之CentOS(十七)--与Linux文件和目录管理相关的一些重要命令①
查看>>
The Perfect Stall(二分图匹配,最大流EK算法)
查看>>
字符串处理
查看>>
know you with a highschool
查看>>
类对象VB.NET面向对象设计
查看>>