当前位置:   article > 正文

iOS - UIButton连续点击事件控制

ios开发 连续点击5次事件

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

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

自己用过的两种方法:
  • enabled
  • Runtime

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

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

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

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

如下面代码:

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

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

特殊需求

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

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

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

红框选中的

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

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

sendAction:to:forEvent:

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

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

UIButton+RepeatClickControl

  1. //.h文件
  2. #import <UIKit/UIKit.h>
  3. @interface UIButton (RepeatClickControl)
  4. @property (assign, nonatomic) NSTimeInterval noClickInterval;
  5. @end
  6. //.m文件
  7. #import "UIButton+RepeatClickControl.h"
  8. #import <objc/runtime.h>
  9. static const NSTimeInterval defautltTimeInterval = 1.0;
  10. @interface UIButton()
  11. @property (assign, nonatomic) BOOL isIngoreClick; //不顾点击
  12. @end
  13. @implementation UIButton (RepeatClickControl)
  14. + (void)load
  15. {
  16. //Method Swizzling
  17. static dispatch_once_t onceToken;
  18. dispatch_once(&onceToken, ^{
  19. /*
  20. struct objc_method {
  21. SEL _Nonnull method_name OBJC2_UNAVAILABLE;
  22. char * _Nullable method_types OBJC2_UNAVAILABLE;
  23. IMP _Nonnull method_imp OBJC2_UNAVAILABLE;
  24. }
  25. */
  26. //获取方法
  27. SEL defaultButtonActionSEL = @selector(sendAction:to:forEvent:);
  28. SEL changeButtonActionSEL = @selector(mySendAction:to:forEvent:);
  29. Method defaultButtonActionMethod = class_getInstanceMethod(self, defaultButtonActionSEL);
  30. Method changeButtonActionMethod = class_getInstanceMethod(self, changeButtonActionSEL);
  31. //添加方法
  32. BOOL isAdd = class_addMethod(self, defaultButtonActionSEL, method_getImplementation(changeButtonActionMethod), method_getTypeEncoding(changeButtonActionMethod));
  33. if ( isAdd ) {
  34. //添加成功,那么就替换实现方法
  35. class_replaceMethod(self, changeButtonActionSEL, method_getImplementation(defaultButtonActionMethod), method_getTypeEncoding(defaultButtonActionMethod));
  36. } else {
  37. //添加不成功,说明已经有方法了,那么直接执行方法实现的对调
  38. method_exchangeImplementations(defaultButtonActionMethod, changeButtonActionMethod);
  39. }
  40. });
  41. }
  42. - (void)mySendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
  43. {
  44. if ( [NSStringFromClass([self class]) isEqualToString:@"UIButton"] ) {
  45. if ( self.isIngoreClick ) {
  46. //不能点击
  47. return;
  48. } else {
  49. self.noClickInterval = (self.noClickInterval == 0) ? defautltTimeInterval : self.noClickInterval;
  50. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.noClickInterval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  51. self.isIngoreClick = NO;
  52. });
  53. }
  54. }
  55. self.isIngoreClick = YES;
  56. //这里并不会造成死循环,因为已经替换实现方法了
  57. [self mySendAction:action to:target forEvent:event];
  58. }
  59. #pragma mark - AssociatedObject
  60. - (void)setNoClickInterval:(NSTimeInterval)noClickInterval
  61. {
  62. objc_setAssociatedObject(self, @selector(noClickInterval), @(noClickInterval), OBJC_ASSOCIATION_ASSIGN);
  63. }
  64. - (NSTimeInterval)noClickInterval
  65. {
  66. return [objc_getAssociatedObject(self, @selector(noClickInterval)) doubleValue];
  67. }
  68. - (void)setIsIngoreClick:(BOOL)isIngoreClick
  69. {
  70. objc_setAssociatedObject(self, @selector(isIngoreClick), @(isIngoreClick), OBJC_ASSOCIATION_ASSIGN);
  71. }
  72. - (BOOL)isIngoreClick
  73. {
  74. return [objc_getAssociatedObject(self, @selector(isIngoreClick)) boolValue];
  75. }
  76. @end
  77. 复制代码

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/93571
推荐阅读
  

闽ICP备14008679号