实现方法
-
方法一 设置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事件是否有效。
网友评论