原创文章,如转请备注转载地址

只是给自己写一些觉得实用的内容

自己用过的两种方法:

  • enabled
  • Runtime

1.先来说一下enabled, enabled是UIButton的父类UIControl的一个属性,

default is YES. if NO, ignores touch events and subclasses may draw differently

简单的说就是UIButton的点击事件是否能够响应;

在实践项目开发中,有时候我们会点击某个按钮,进行网络请求的操作,在网路请求的过程中,按钮是不能再点击,不然会再进行一次网络请求。这时候可以使用 enabled 这个属性,来控制按钮的交互事件。

如下面代码:


UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.enabled = NO;
[[ApiManager shareInstance] fetchDataWithCompletionHandle:^(id data, NSError *error) {btn.enabled = YES;
}];复制代码

通过在合适的时机,设置按钮的enabled属性可以起到大部分的作用。

特殊需求

现在还是有另外一种需求,我在按钮点击后,几秒内,按钮都不让触发点击事件,这时候Runtime就要出马了。

接下来说第二种方式,来控制连续点击事件。

我们先断点在一个按钮的点击事件中,看看从点击到响应,执行了多少方法。

红框选中的


- (void)sendAction:(SEL)action to:(nullable id)target forEvent:(nullable UIEvent *)event;- (void)sendActionsForControlEvents:(UIControlEvents)controlEvents;复制代码

可以看出所有的UIKit中的控制,触发点击事件的时候都会执行

sendAction:to:forEvent:

这个方法。所有我们只需要在运行时期,在这个方法中添加一些时间限制,在受限时间期间,点击不做任何相应接口。

直接上代码: 自己写了一个UIButton的Category

UIButton+RepeatClickControl


//.h文件
#import <UIKit/UIKit.h>@interface UIButton (RepeatClickControl)@property (assign, nonatomic) NSTimeInterval noClickInterval;@end//.m文件
#import "UIButton+RepeatClickControl.h"
#import <objc/runtime.h>static const NSTimeInterval defautltTimeInterval = 1.0;@interface UIButton()@property (assign, nonatomic) BOOL isIngoreClick;  //不顾点击@end@implementation UIButton (RepeatClickControl)+ (void)load
{//Method Swizzlingstatic dispatch_once_t onceToken;dispatch_once(&onceToken, ^{/*struct objc_method {SEL _Nonnull method_name                                 OBJC2_UNAVAILABLE;char * _Nullable method_types                            OBJC2_UNAVAILABLE;IMP _Nonnull method_imp                                  OBJC2_UNAVAILABLE;}*///获取方法SEL defaultButtonActionSEL = @selector(sendAction:to:forEvent:);SEL changeButtonActionSEL = @selector(mySendAction:to:forEvent:);Method defaultButtonActionMethod = class_getInstanceMethod(self, defaultButtonActionSEL);Method changeButtonActionMethod = class_getInstanceMethod(self, changeButtonActionSEL);//添加方法BOOL isAdd = class_addMethod(self, defaultButtonActionSEL, method_getImplementation(changeButtonActionMethod), method_getTypeEncoding(changeButtonActionMethod));if ( isAdd ) {//添加成功,那么就替换实现方法class_replaceMethod(self, changeButtonActionSEL, method_getImplementation(defaultButtonActionMethod), method_getTypeEncoding(defaultButtonActionMethod));} else {//添加不成功,说明已经有方法了,那么直接执行方法实现的对调method_exchangeImplementations(defaultButtonActionMethod, changeButtonActionMethod);}});
}- (void)mySendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
{if ( [NSStringFromClass([self class]) isEqualToString:@"UIButton"] ) {if ( self.isIngoreClick ) {//不能点击return;} else {self.noClickInterval = (self.noClickInterval == 0) ? defautltTimeInterval : self.noClickInterval;dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.noClickInterval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{self.isIngoreClick = NO;});}}self.isIngoreClick = YES;//这里并不会造成死循环,因为已经替换实现方法了[self mySendAction:action to:target forEvent:event];
}#pragma mark - AssociatedObject- (void)setNoClickInterval:(NSTimeInterval)noClickInterval
{objc_setAssociatedObject(self, @selector(noClickInterval), @(noClickInterval), OBJC_ASSOCIATION_ASSIGN);
}- (NSTimeInterval)noClickInterval
{return [objc_getAssociatedObject(self, @selector(noClickInterval)) doubleValue];
}- (void)setIsIngoreClick:(BOOL)isIngoreClick
{objc_setAssociatedObject(self, @selector(isIngoreClick), @(isIngoreClick), OBJC_ASSOCIATION_ASSIGN);
}- (BOOL)isIngoreClick
{return [objc_getAssociatedObject(self, @selector(isIngoreClick)) boolValue];
}@end复制代码

直接创建放到项目中接口使用,至于自己要限制多少秒可以进行手动设置,默认是1秒内不能连续点击。 手动设置的话,如下代码即可:

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.noClickInterval = 4.0;
其余初始化就省略,直接设置 noClickInterval 即可;
复制代码
我还会再回来了。我是卤蛋有点黑。再见。

转载于:https://juejin.im/post/5a96443c6fb9a06340523e63

iOS - UIButton连续点击事件控制相关推荐

  1. swift3 按钮触发事件_swift5.3 UIView 与 UIButton 点击事件传递参数

    UIView 与 UIbutton 点击事件的参数传递:目前我通过 tag 解决了 UIButton 的点击参数传递 设置 UIButton 的 tag,详细见代码let playButton = U ...

  2. JS双击触发2次单击问题解决方案/js区分单击和双击/连续点击事件

    开发过程中,我们可能会遇到单击(onclick)和双击(ondblclick)需要实现不同的交互效果.当我们在同一个对象同时绑定了onclick和ondblclick事件,双击对象会执行2次单击事件和 ...

  3. easyui中linkbutton连续点击事件

    easyui中linkbutton连续点击事件 <a id="voice" class="easyui-linkbutton easyui-tooltip" ...

  4. iOS UIbutton 点击无反应的几种情况

    1.UIButton不能点击情况的第一种是,你将button添加到一个不能响应点击事件的View里.如你将button添加到UIImageView中,解决办法只需将UIImageView的 userI ...

  5. iOS 状态栏点击事件

    iOS应用中,点击状态栏会使得滚动视图回滚到顶部,但如果当前视图控制器中包含多个滚动视图就会失效. 这里我们可以通过以下的方法获取状态栏的点击事件. 方法一:AppDelegate.m #pragma ...

  6. Android 防止同时按下两个按钮触发两个事件,连续点击事件

    不知道大家在写程序的时候有没有遇到这种问题,解决的办法很简单. 1. 在这两个按钮 或其他控件 的父控件上加上     android:splitMotionEvents="false&qu ...

  7. iOS 使点击事件穿透透明的UIView

    通过实例讲解,如图(三个深灰色按钮处于同一个contentView中): 悬浮的三个按钮下方有一个可以点击的灰色区域,但是点击按钮之间的透明区域, 这三个按钮的contentView会响应这个点击事件 ...

  8. iOS xib 点击事件未响应

    一个困扰我两天的问题,终于解决了,人类在探索未知领域的时候总是这么步履维艰.一步一步透过层层浓雾,登上山顶,长开有力的臂膀,撕破笼罩在周身的浓雾,一缕阳光照进你的胸膛,豁然间:一种拨开云雾见青天的感觉 ...

  9. php 连续点击事件,javascript设置连续两次点击按钮时间间隔的方法_javascript技巧...

    本文实例讲述了javascript设置连续两次点击按钮时间间隔的方法,分享给大家供大家参考.具体实现方法如下: 很多时候我们在实际应用中,可能并不希望按钮联系被不间断的点击,所以要限定一定的时间间隔才 ...

  10. IOS 微信返回按钮事件控制弹层关闭还是返回上一页

    在微信公共号内绑定域名后或微信内打开第三方链接跳转非单页面网站时,经常会有弹层Modal的需求,此时如果用户习惯性点击微信自带的返回"<"按钮,就会跳转回上一页或退出网站,而 ...

最新文章

  1. 简单排查定位linux系统的性能瓶颈
  2. apache-jmeter-3.1的简单压力测试使用方法(下载和安装)
  3. 10 i lt shell的if_shell学习(10)- if的使用
  4. 情人节,你们的CEO都在干嘛?
  5. 【mysql学习】疑问点记录
  6. html引入jquery_jQuery
  7. c语言烟花百度云,C语言实现放烟花的程序
  8. 隐藏GridControl的“Drag a column header here to group by that column”
  9. 软件项目组织管理(六)项目时间管理
  10. 设计模式(二)设计模式的本质
  11. JVM中的五大内存区域划分详解
  12. .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  13. java Paths
  14. Web前端JavaScript笔记(4)节点
  15. “我想再当一次 CEO,所以我离开了 IBM。”
  16. 夏梦竹谈Hive vs. HBase的区别
  17. matlab中 dataset用法,dataset中shuffle()、repeat()、batch()用法
  18. 真实的网络赚钱经历:另类推广引流操作CPA!
  19. 网课答案公众号搭建-网课题库接口
  20. 协方差矩阵的定义性质与python实现

热门文章

  1. Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced) - image is bein
  2. 计算机主板显卡型号怎么看,如何查看电脑显卡?4个方法教会你
  3. 放大镜原理分析及jquery实现
  4. Redis(三) Redis的持久化 RDB与AOF
  5. 都说ADAS不好用,那智能后视镜和车载智能行业该如何走下去?
  6. 2010~2011手机CPU对比
  7. SpringDataJPA使用Specification动态查询和分页
  8. 计算机专业考研410分,从一个中专生到考研410分的历程
  9. STM32小车篇之超声波测距
  10. oracle 10015 trace name adjust_scn level level_num