美文网首页
ios button防重

ios button防重

作者: NanNan | 来源:发表于2019-09-25 16:24 被阅读0次

    实现方法

    • 方法一 设置enabled或userInteractionEnabled属性

    • 方法二 借助cancelPreviousPerformRequestsWithTarget:selector:object实现

    • 方法三 通过runtime交换方法实现

    一 使用场景

    在实际应用场景中,有几个业务场景需要控制UIButton响应事件的时间间隔。

    • 1 当点击按钮来执行网络请求时,若请求耗时稍长,用户往往会多次点击。这样,就执行了多次请求,造成资源浪费。

    • 2 在移动终端设备性能较差时,连续点击按钮会执行多次事件(比如push出来多个viewController)。

    • 3 防止暴力点击。

    方法一:

    通过UIButton的enabled属性和userInteractionEnabled属性控制按钮是否可点击。此方案在逻辑上比较清晰、易懂,但具体代码书写分散,常常涉及多个地方。

    方法二:

    通过 NSObject 的两个方法

    
    // 此方法会在连续点击按钮时取消之前的点击事件,从而只执行最后一次点击事件+(void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;// 多长时间后做某件事情-(void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
    
    
    
    /** 方法一 */-(void)tapBtn:(UIButton*)btn{NSLog(@"按钮点击了...");// 此方法会在连续点击按钮时取消之前的点击事件,从而只执行最后一次点击事件[NSObject cancelPreviousPerformRequestsWithTarget:selfselector:@selector(buttonClickedAction:)object:btn];// 多长时间后做某件事情[selfperformSelector:@selector(buttonClickedAction:)withObject:btn afterDelay:2.0];}-(void)buttonClickedAction:(UIButton*)btn{NSLog(@"真正开始执行业务 - 比如网络请求...");}
    
    

    总结:会出现延时现象,并且需要对大量的UIButton做处理,工作量大,不方便。

    方法三:

    通过Runtime交换UIButton的响应事件方法,从而控制响应事件的时间间隔。

    实现步骤如下:

    • 1 创建一个UIButton的分类,使用runtime增加public属性cs_eventInterval和private属性cs_eventInvalid。

    • 2 在+load方法中使用runtime将UIButton的-sendAction:to:forEvent:方法与自定义的cs_sendAction:to:forEvent:方法进行交换

    • 3 使用cs_eventInterval作为控制cs_eventInvalid的计时因子,用cs_eventInvalid控制UIButton的event事件是否有效。

    相关文章

      网友评论

          本文标题:ios button防重

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