zoukankan      html  css  js  c++  java
  • 解决UIButton 连续点击重复响应事件问题

    经常会遇到重复点击某个按钮 事件被响应多次的情景, 有时候可能对程序本身并没有什么影响 , 可有时候偏偏需要限制button响应事件直接的间隔 .

    方法一 : 标记

    1 . 利用空闲enable属性来标记

    1 - (IBAction)clickBtn1:(UIbutton *)sender
    2 {
    3     sender.enabled = NO;
    4     doSomething
    5     sender.enabled = YES;
    6 }

    2. 专门定义一个属性标记

    1 - (IBAction)clickBtn1:(UIbutton *)sender
    2 {
    3     if (doingSomeThing) return;
    4     doingSomeThing = YES;
    5     doSomething
    6     doingSomeThing = NO;
    7 }

    方法二 :  利用runtime来实现

    和前一种方法的实现原理基本一样  只不过通过给UIControl 添加分类  由此扩大了应用范围  

    首先给按钮条件一个属性 记录目标间隔时间

     1 @interface UIControl (MYButton)
     2 @property (nonatomic, assign) NSTimeInterval my_acceptEventInterval;   // 可以用这个给重复点击加间隔
     3 @end
     4 static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";
     5 - (NSTimeInterval)my_acceptEventInterval
     6 {
     7     return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];
     8 }
     9 - (void)setMy_acceptEventInterval:(NSTimeInterval)my_acceptEventInterval
    10 {
    11     objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(my_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    12 }
    //交换系统的方法
     
    1 @implementation UIControl (MYButton)
    2 + (void)load
    3 {
    4     Method a = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
    5     Method b = class_getInstanceMethod(self, @selector(__my_sendAction:to:forEvent:));
    6     method_exchangeImplementations(a, b);
    7 }
    8 @end

    //定义自己的点击事件  

     1 - (void)__my_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
     2 {
     3     if (self.my_ignoreEvent) return;
     4     if (self.my_acceptEventInterval > 0)
     5     {
     6         self.my_ignoreEvent = YES;
     7         [self performSelector:@selector(setMy_ignoreEvent:) withObject:@(NO) afterDelay:self.my_acceptEventInterval];
     8     }
     9     [self __my_sendAction:action to:target forEvent:event];
    10 }

    实际使用起来就是这个样子

    1  UIButton *tempBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    2     [tempBtn addTarget:self action:@selector(clickWithInterval:) forControlEvents:UIControlEventTouchUpInside];
    3     tempBtn.uxy_acceptEventInterval = 0.5;

    一个应用Runtime 的小小实例

  • 相关阅读:
    centos 添加 composer
    laravel5 缓存的使用
    git 的使用
    php 消息队列 rabbitmq 的安装使用
    vue插件大汇总
    vue 2.0 Gzip打包压缩
    Easy Mock 为啥那么打不开了?
    element ui 打印 表格
    解决 element 日期范围选择问题(只能选择相邻的 连两个月)
    vue router 的路由传参 params 和 query 的 区别
  • 原文地址:https://www.cnblogs.com/ruihaha/p/5886304.html
Copyright © 2011-2022 走看看