假设,当
点击一个页面中的某个Button,会Push到另一个页面。
如果你的手速太快【比如你也像我一样20多年单身练就一把好手速【比如你遇到了谜一样的测试队友【比如你的客户反馈了下面的问题:
短时间内点击了两次Button,结果执行了两次Push操作。
如果你并不打算为你的APP埋下诸如上面这样的彩蛋,那最好就避免这样的行为。
这里给出两种解决方案
第一种:从Button的enable状态入手。
这个是比较轻量级的解决办法,思路就是如果点击了这个button,那就让这个button在一个规定时间内无法继续点击。
是针对单个Button的操作。
技能前摇:
创建UIButton Category
->将Category导入全局(.pch文件,或者rootVC等等)
->打开这个Category的.m文件
依次重写三个方法:
- (void)willMoveToSuperview:(UIView *)newSuperview {
[super willMoveToSuperview:newSuperview];
[self addTarget:self action:@selector(buttonStartClick:) forControlEvents:UIControlEventTouchUpInside];
}
- (void)buttonStartClick:(id)sender {
self.button.enabled = NO;
[self performSelector:@selector(changeButtonStatus) withObject:nil afterDelay:0.5f];
}
- (void)changeButtonStatus {
self.button.enabled = YES;
}
原理就是在这个button被加载的时候添加一个target,当被点击的时候通过设置enable来使其在之后的0.5秒内无法被点击。
该方法借鉴自button防止被重复点击的相关方法(详细版)
第二种:设置View的userInteractionEnabled
上一种方法的优势是只是对button对象进行了设置,不会对其他元素产生影响。
当一个页面有多个元素都可以被点击(比如一个Image的单击手势)的时候,我们点击了其中一个之后,在同一时间(极短时间内)不希望其他元素也被点击,这种时候对单一的Button设置可能会无法完成需求。
以下代码可以解决上面描述的问题。
技能前摇和方法一相同,都是在UIButton的category里面进行设置。
- (void)willMoveToSuperview:(UIView *)newSuperview {
[super willMoveToSuperview:newSuperview];
[self addTarget:self action:@selector(buttonStartClick:) forControlEvents:UIControlEventTouchUpInside];
}
- (void)buttonStartClick:(id)sender {
[UIApplication sharedApplication].keyWindow.userInteractionEnabled = NO;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[UIApplication sharedApplication].keyWindow.userInteractionEnabled = YES;
});
}
- (void)checkWindowUserInteractionEnabledWhenRemoveFromSuperview {
if ([UIApplication sharedApplication].keyWindow.userInteractionEnabled) return;
[UIApplication sharedApplication].keyWindow.userInteractionEnabled = YES;
}
- (void)removeFromSuperview {
[super removeFromSuperview];
[self checkWindowUserInteractionEnabledWhenRemoveFromSuperview];
}
原理是当点击了button的时候,使整个Window的userInteractionEnabled在0.5秒内为NO。
如果你对上面两种方法有疑问,或者有更好的方法,欢迎在下方的评论区探讨~。