首页 > 代码库 > iOS之防止用户重复点击Button(按钮)问题
iOS之防止用户重复点击Button(按钮)问题
在项目中,我们往往会遇到这样的问题:因为网络较慢的原因,用户会不耐烦的一直去点击按钮,这样导致的结果时:相关代码一遍一遍的被重复执行,如果按钮的事件是网络请求的话,这样又导致一种网络请求的循环。所以我们解决的方法是在执行按钮点击事件时,为Button加上防止重复点击的方法。
具体的有以下几种方法:
1、使用performSelector方法
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #bdb2a0 } span.s1 { } span.s2 { color: #c66576 } span.s3 { color: #3fa7ad }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #bdb2a0 } span.s1 { } span.s2 { color: #c66576 } span.s3 { color: #3fa7ad }</style>- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
我们在点击事件中添加延迟执行事件,在延迟的这个期间,该按钮的enabled设置为NO,即不能点击。过了延迟时间后再设置为YES。以这种方式防止用户重复点击按钮。
代码如下:
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #bdb2a0 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px "PingFang SC"; color: #7d7e7e } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #76c2ff } span.s1 { } span.s2 { color: #c66576 } span.s3 { font: 17.0px Menlo; color: #bdb2a0 } span.s4 { font: 17.0px Menlo } span.s5 { color: #bdb2a0 } span.s6 { color: #8b87ff }</style>-(void)buttonClicked:(id)sender
{
sender.enabled = NO;
//防止用户重复点击
[self performSelector:@selector(changeButtonStatus:) withObject:nil afterDelay:1.0f];
}
-(void)changeButtonStatus:(id)sender
{
sender.enabled = YES;
}
以上的方法可以很好的解决我们重复点击按钮的问题,但更推荐的却是下面的这种方法:
2、使用cancelPreviousPerformRequestsWithTarget 和 performSelector 结合的方法(推荐使用)
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #bdb2a0 } span.s1 { } span.s2 { color: #c66576 }</style>
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
原理是:我们每次点击按钮时,先执行取消之前的按钮点击执行事件,然后再去执行一个延迟执行方法(方法中执行的是按钮执行的事件)。代码如下:
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #bdb2a0 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px "PingFang SC"; color: #7d7e7e } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #76c2ff } p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #bdb2a0; min-height: 20.0px } span.s1 { } span.s2 { color: #c66576 } span.s3 { font: 17.0px Menlo; color: #bdb2a0 } span.s4 { font: 17.0px Menlo } span.s5 { color: #bdb2a0 } span.s6 { color: #8b87ff }</style>- (void)buttonClicked:(id)sender
{
//在这里做按钮的想做的事情。
}
- (void)starButtonClicked:(id)sender
{
//先将未到时间执行前的任务取消。
[[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(buttonClicked:)object:sender];
[self performSelector:@selector(buttonClicked:)withObject:sender afterDelay:0.2f];
}
第二种是我们比较推荐的方法,但这两种方法都可以解决按钮被重复点击的问题。
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 }</style>
iOS之防止用户重复点击Button(按钮)问题