博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS动态修改按钮响应时间
阅读量:4631 次
发布时间:2019-06-09

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

 在项目开发中我们可能会遇到这样子的情况,比如在我们登陆的时候需要把数据发送给服务器进行比对,通常我们的做法是当用户点击按钮后,使用一个加载效果的view遮挡住当前界面,直到服务器返回数据或者超时。如果不进行遮挡,用户可能频繁的点击登录,而你又一直发送数据,这样子显然是不信的,解决这样子的方法有很多种。

 今天我们说一种方式,让按钮响应时间由自己控制。

要想达到这种效果你可能需要去了解一下什么是 Runtime

 

 OK,如果你不是很了解也没有关系,对于这个功能用到的也不多。其中包括:

1 objc_getAssociatedObject(<#id object#>, <#const void *key#>)  2 参数一:一般都是self,调用者 3 参数二:你的key(key - value) 4  5  6  有get方法那么肯定会有set 7  8 objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>) 9 参数一:self10 参数二:key11 参数三:value,这里要注意包装成为id类型对于int、float等基本类型12 参数四:MRC基础的东西13 /*14 OBJC_ASSOCIATION_ASSIGN = 0, 15 OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, 16 OBJC_ASSOCIATION_COPY_NONATOMIC = 3, 17 OBJC_ASSOCIATION_RETAIN = 01401, 18 OBJC_ASSOCIATION_COPY = 0140319 */20 为什么会用到上面的方法,因为在给一个Category动态添加属性。

 

 

 

 

完成了动态添加属性之后,我们需要利用Runtime的性质去对系统的方法动动手脚了。

 这里我们还需要了解三个方法 分别是:

通过这个方法可以得到系统对象方法的编号,类型是Methodclass_getInstanceMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>)通过这个方法可以获取到系统类方法的编号,类型是Methodclass_getClassMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>)这里我们要获取到的是对象的方法,所以用第一个,在获取到系统的方法之后呢,我们需要定义一个自己的方法,用来和系统的方法进行互换互换两个方法的编号method_exchangeImplementations(<#Method m1#>, <#Method m2#>)如图所示:互换前和互换后交换前

 

交换后

 

所以我就达到了交换的目的。

 

了解了上面的几个方法之后,我们就可以开始 写代码了

 首先如果想要使用Runtime第一步你得先导入:

  #import <objc/message.h>

第二步利用Runtime动态的去添加属性
这里要重写get set方法。
通过kvc赋值,所以我们先要有key,用来存/取数据

static char * const PQ_ACCEPTTIMEKEY = "pq_acceptTime";static char * const PQ_DELAYINTERVALKEY = "pq_delayButtonInterVal";// getter method- (NSTimeInterval)pq_delayButtonInterVal{return [objc_getAssociatedObject(self, PQ_DELAYINTERVALKEY) doubleValue];}- (NSTimeInterval)pq_acceptTime{return [objc_getAssociatedObject(self, PQ_ACCEPTTIMEKEY) doubleValue];}// setter method- (void)setPq_delayButtonInterVal:(NSTimeInterval)pq_delayButtonInterVal{objc_setAssociatedObject(self, PQ_DELAYINTERVALKEY, @(pq_delayButtonInterVal), OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (void)setPq_acceptTime:(NSTimeInterval)pq_acceptTime{objc_setAssociatedObject(self, PQ_ACCEPTTIMEKEY, @(pq_acceptTime), OBJC_ASSOCIATION_RETAIN_NONATOMIC);}

 

完成动态添加属性之后,我们要把系统的方法和我们的方法进行互换,以便于添加功能。

1 + (void)load{ 2 static dispatch_once_t onceToken; 3 dispatch_once(&onceToken, ^{ 4 Method systemMethod = class_getInstanceMethod([self class], @selector(sendAction:to:forEvent:)); 5 Method myselfMethod = class_getInstanceMethod([self class], @selector(pq_sendAction:to:forEvent:)); 6 BOOL isAdd = class_addMethod([self class], @selector(sendAction:to:forEvent:), method_getImplementation(myselfMethod), method_getTypeEncoding(myselfMethod)); 7 if (!isAdd) { 8 method_exchangeImplementations(systemMethod, myselfMethod); 9 }10 });11 }

 

 

 然后我们就要写自己的方法了,这里有一个小技巧把,先把系统的方法名打上,比如对于这个方法可以这样做:

1. 先输入 - sendAction 一般打到这里系统就会提示自动补全

2. 得到系统的方法名之后在前面添加我们的前缀,表示是我们自己的方法。比如

这里我就添加了一个前缀pq,再用下划线连接。
- (void)pq_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event

接下来就是处理代码的实现

1 这里用到的两个变量一个需要对外公开(.h文件中),一个写在(.m文件中的) 2 @interface UIControl () 3  4 @property (nonatomic,assign) NSTimeInterval pq_acceptTime; 5  6 @end 7  8 - (void)pq_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event{ 9 if (NSDate.date.timeIntervalSince1970 - self.pq_acceptTime < self.pq_delayButtonInterVal) {10 NSLog(@"现在点我我也不鸟你");11 return;12 }13 if (self.pq_delayButtonInterVal > 0) {14 self.pq_acceptTime = NSDate.date.timeIntervalSince1970;15 }16 [self pq_sendAction:action to:target forEvent:event];17 }

 

 

 至此,功能就完成啦,小伙伴们可以马上使用了

自己创建一个button,然后设置如下代码,如果你发现找不到你自己定义的属性,那么你一般是没有导入头文件在ViewController中
//设置这个延时时间是5秒钟
self.clickMeBtn.pq_delayButtonInterVal = 5;

 到这里就全部完成啦,码字不容易,如果您觉得还行,麻烦顶一下!转载请注明出处,谢谢。

转载于:https://www.cnblogs.com/pq1993/p/5699621.html

你可能感兴趣的文章
正则表达式string对象方法
查看>>
解析json实例
查看>>
spring中实现自己的初始化逻辑
查看>>
Accommodation development for Kaikoura
查看>>
Oracle11.2新特性之listagg函数 (行列转换)
查看>>
Flutter学习之动态ListView
查看>>
myeclipse中安装svn插件
查看>>
微信小程序----调用用户信息
查看>>
Ubuntu系统---安NVIDIA 驱动后 CUDA+cuDNN 安装
查看>>
Spring Boot配置全局异常捕获
查看>>
Java 的zip压缩和解压缩
查看>>
SPOJ375(树链剖分)
查看>>
C基础知识小总结(十)
查看>>
Ignatius and the Princess IV (水题)
查看>>
ConcurrentHashMap实现原理及源码分析
查看>>
AES加解密
查看>>
洛谷 P5019 铺设道路(差分)
查看>>
CSS层叠样式
查看>>
Pycharm初始创建项目和环境搭建(解决aconda库文件引入不全等问题)
查看>>
Spring Boot启动过程(二)
查看>>