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

今天我们说一种方式,让按钮响应时间由自己控制。
要想达到这种效果你可能需要去了解一下什么是 Runtime

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

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

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

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

通过这个方法可以得到系统对象方法的编号,类型是Method
class_getInstanceMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>) 通过这个方法可以获取到系统类方法的编号,类型是Method
class_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);
}

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

 + (void)load{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method systemMethod = class_getInstanceMethod([self class], @selector(sendAction:to:forEvent:));
Method myselfMethod = class_getInstanceMethod([self class], @selector(pq_sendAction:to:forEvent:));
BOOL isAdd = class_addMethod([self class], @selector(sendAction:to:forEvent:), method_getImplementation(myselfMethod), method_getTypeEncoding(myselfMethod));
if (!isAdd) {
method_exchangeImplementations(systemMethod, myselfMethod);
}
});
}

然后我们就要写自己的方法了,这里有一个小技巧把,先把系统的方法名打上,比如对于这个方法可以这样做:
1. 先输入 - sendAction 一般打到这里系统就会提示自动补全

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

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

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

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

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

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

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

IOS动态修改按钮响应时间的更多相关文章

  1. iOS 动态修改导航栏颜色 UINavigationBar

    示例 所谓动态修改  意思是 在当前页面滚动的过程中 亦或 是在 触发返回事件\进入一个新的页面  导航栏的动态变化 由于系统级别的navBar 高度集成  很多自己想实现的功能 很不好弄 如果是通过 ...

  2. ios 动态修改UILabel字体大小

    - (IBAction)sliderChange:(id)sender {   NSLog(@"sliderChange");   UISlider *slider = (UISl ...

  3. 聊聊 Vue 中 title 的动态修改

    由于之前的 Vue 项目打包成果物一直是嵌入集成平台中,所以一直没有关注过项目的 title.直到最近,突然有个需求,要求点击按钮在集成平台外新开一个页面,此时我才发现,原来我的项目的 title 一 ...

  4. uniapp动态修改导航栏

    1.修改导航栏buttons 如图动态修改角标 <template> <view> </view> </template> <script> ...

  5. ReactNative 根据scrollView/listview滑动距离动态修改NavBar颜色

    我们常见某些APP上滑的时候,NavBar颜色会从透明渐变为某种颜色 原理非常简单,根据scrollView的回调动态修改NavBar的透明度即可. 在RN中,尤其是ListView中这个回调不是很好 ...

  6. 自己动手丰衣足食之轮播图一动态修改marginTop属性实现轮播图

    引言 学习jQuery有年头了,刚开始学习时自己动手写过轮播图,放的久了以至于忘了大致思路了.现在转而做前端,抽空把jquery轮播图拿出来写一写,把各种思路都自己练习练习,这里主要使用动态修改mar ...

  7. Swift - 实现点击cell动态修改高度

    Swift - 实现点击cell动态修改高度 效果 源码 https://github.com/YouXianMing/Swift-Animations // // TapCellAnimationC ...

  8. [SAP ABAP开发技术总结]动态修改选择屏幕

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. iOS动态部署方案

    转载: iOS动态部署方案 前言 这里讨论的动态部署方案,就是指通过不发版的方式,将新的内容.新的业务流程部署进已发布的App.因为苹果的审核周期比较长,而且苹果的限制比较多,业界在这里也没有特别多的 ...

随机推荐

  1. jQuery掷骰子

    网上找的jQuery掷骰子效果,测试兼容IE7及以上浏览器,IE6没有测试 js代码如下: $(function(){ var dice = $("#dice"); dice.cl ...

  2. 【HTML】Beginner6:Link

    1.Link HTML wich basically means a system of linked text     link to another HTML file or any file a ...

  3. ZOJ-2365 Strong Defence 贪心,BFS

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2365 我没看懂题目...这样理解:一个有向图,要给一些边染色,使 ...

  4. Sitemap Editors for Dynamics CRM 2013

    I’ve started using a couple of different sitemap editors in my projects for CRM 2013. These tools he ...

  5. 中局域网LAN中建立局域网可访问的类GitHub的服务器

    There are several ways to do this Host internal repositories like Gitlab (free software) or Stash. T ...

  6. Yii目录树扩展ztree,ctree等

    ztree: http://blog.csdn.net/jake451/article/details/7091449 http://hi.baidu.com/qiangtan/item/e85c48 ...

  7. oc学习之路----代理模式2-使用步骤

    之前已经写过一个个人关于代理模式的一些看法,现在就来总结一下使用代理模式的步骤吧. 1.先搞清楚谁是谁的代理(delegate) ● 2.定义代理协议,协议名称的命名规范:控件类名 + Delegat ...

  8. VC++ 统计文件夹下面的当日和本月生成的图片

    void GetCapNum(int * todayNum, int * mouthNum) {    string path = ".\\res";//路径位于程序运行目录下的r ...

  9. Copy-VMFile

    将文件移到或移出虚拟机可能会产生问题.首先,你需要安装集成服务,打开文件共享.这只需要一个简单的PowerShell命令:Enable-VMIntegrationService.但是你必须登录到虚拟机 ...

  10. gulp自己主动化任务脚本在HybridApp开发中的使用

    眼下做前端开发的同学可能都熟悉grunt.fis之类的自己主动化构建工具.事实上在HybridApp开发中我们也能够使用这些工具来简化我们的工作.gulp就是一个比grunt,fis都先进的构建工具. ...