在项目中有几个实际业务场景需要控制控件响应事件的时间间隔。比如:
1、当通过点击按钮来执行网络请求时,若请求耗时稍长,用户往往会再点一次。这样,就执行了两次请求,造成了资源浪费。
2、在移动终端性能较差时(比如iPhone 6升级到iOS 11😅),连续点击按钮会执行多次事件(比如push出来多个viewController)。
3、防止暴力点击。
比较好的解决方案是通过Runtime控制UIControl响应事件的时间间隔,直接上代码
Method a = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
Method b = class_getInstanceMethod(self, @selector(__hyn_sendAction:to:forEvent:));
method_exchangeImplementations(a, b);
}
- (void)__hyn_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
if ([self.hyn_ignoreEvent boolValue]) return;
if (self.hyn_acceptEventInterval > 0) {
self.hyn_ignoreEvent = @(YES);
[self performSelector:@selector(setHyn_ignoreEvent:) withObject:@(NO) afterDelay:self.hyn_acceptEventInterval];
}
if ([target respondsToSelector:action]) {
[self __hyn_sendAction:action to:target forEvent:event];
}
}
网友评论