iOS 解决button重复点击问题

作者: bde04638cca8 | 来源:发表于2016-06-14 11:23 被阅读2429次

    项目中经常遇见,重复提交订单的问题。就像之前,项目中有一个功能是抢红包,我自己点的时候都没有问题,别人点就老各种提示。这种问题有点傻逼,也是必要的技能。

    通常我们采用的方法就是

    -(void)buttonClick:(UIbutton*)button{
      button.enabled=No;
      do something(^{
          button.enabled=yes;
    });
    }```
    ###然而现在有一种新的方法,比这个更智能,更实用
    

    @interface UIControl (FF)
    @property (nonatomic, assign) NSTimeInterval fy_acceptEventInterval;
    @property (nonatomic, assign) BOOL fy_ignoreEvent;
    @end
    //实现方法

    @implementation UIControl (FF)
    static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";
    static const char *UIControl_ignoreEvent = "UIControl_ignoreEvent";

    • (NSTimeInterval)fy_acceptEventInterval{
      return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];
      }

    • (void)setFy_acceptEventInterval:(NSTimeInterval)fy_acceptEventInterval{
      objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(fy_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
      }

    • (BOOL)fy_ignoreEvent{
      return [objc_getAssociatedObject(self, UIControl_ignoreEvent) boolValue];
      }

    • (void)setFy_ignoreEvent:(BOOL)fy_ignoreEvent{
      objc_setAssociatedObject(self, UIControl_ignoreEvent, @(fy_ignoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
      }

    • (void)load{
      Method a = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
      Method b = class_getInstanceMethod(self, @selector(_fy_sendAction:to:forEvent:));
      method_exchangeImplementations(a, b);
      }
    • (void)_fy_sendAction:(SEL)selector to:(id)target forEvent:(UIEvent*)event{
      if (self.fy_ignoreEvent) return;

      if (self.fy_acceptEventInterval > 0) {
      self.fy_ignoreEvent = YES;
      [self performSelector:@selector(setFy_ignoreEvent:) withObject:@(NO) afterDelay:self.fy_acceptEventInterval];
      }

      [self _fy_sendAction:selector to:target forEvent:event];
      }
      @end

    创建这样的一个category以后,就可以直接使用按钮的属性(button. fy_acceptEventInterval=2)设置间隔了。
    ###这样做还是没有完美,我看到@茶色花的评论。如果想修改对应状态的背景图片和对应的title的话,还得继续定制。
    

    相关文章

      网友评论

        本文标题:iOS 解决button重复点击问题

        本文链接:https://www.haomeiwen.com/subject/vbcudttx.html