在项目中,我们往往会遇到这样的问题:因为网络较慢的原因,用户会不耐烦的一直去点击按钮,这样导致的结果时:相关代码一遍一遍的被重复执行,如果按钮的事件是网络请求的话,这样又导致一种网络请求的循环。所以我们解决的方法是在执行按钮点击事件时,为Button加上防止重复点击的方法。

具体的有以下几种方法:

1、使用performSelector方法


- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;

我们在点击事件中添加延迟执行事件,在延迟的这个期间,该按钮的enabled设置为NO,即不能点击。过了延迟时间后再设置为YES。以这种方式防止用户重复点击按钮。

代码如下:

-(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 结合的方法(推荐使用)

 
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;
 
 
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
 

原理是:我们每次点击按钮时,先执行取消之前的按钮点击执行事件,然后再去执行一个延迟执行方法(方法中执行的是按钮执行的事件)。代码如下:

- (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];
}

第二种是我们比较推荐的方法,但这两种方法都可以解决按钮被重复点击的问题。


iOS之防止用户重复点击Button(按钮)问题的更多相关文章

  1. asp.net中如何防止用户重复点击提交按钮

    asp.net中如何防止用户重复点击提交按钮   asp.net 中防止因为网速慢等影响交互的问题导致用户可能点击多次提交按钮,从而导致数据库中出现多条重复的记录,经过亲自验证在网上找的方法,找到两个 ...

  2. RFS_点击button按钮之后,RFS出现卡死的问题

    [html代码] <html> <head> <title> 主窗口 </title> </head> <body> <d ...

  3. PHP——0128练习相关2——js点击button按钮跳转到另一个新页面

    js点击button按钮跳转到另一个新页面 投稿:whsnow 字体:[增加 减小] 类型:转载 时间:2014-10-10我要评论 点击按钮怎么跳转到另外一个页面呢?点击图片要跳转到新的页面时,怎么 ...

  4. 【小程序开发】 点击button按钮,引导用户授权

    一. 前言 小程序官方文档,上面说明 wx.getUserInfo(OBJECT) 注意:此接口有调整,使用该接口将不再出现授权弹窗,请使用 <button open-type="ge ...

  5. 点击Button按钮实现页面跳转

    1.首先我们新建一个带有button按钮的页面 <button type="submit" class="form-contrpl">注册</ ...

  6. 标签button:点击button按钮时,出现了页面自动刷新的情况

    原html: <button class="btn btn-primary" id="btnSubmit" name="btnSubmit&qu ...

  7. 问题:asp.net 点击button按钮调到页面顶部;结果:asp.net点击一个按钮,使页面跳转到本面页上的指定位置

    asp.net点击一个按钮,使页面跳转到本面页上的指定位置 (2011-04-19 16:46:51) 转载▼ 标签: it   最近在做一个项目. 用到标题所说的功能. 实现方法: 1.在aspx中 ...

  8. js点击事件防止用户重复点击执行

    点击事件里给button标签加一个自定义属性,存上次点击时间 追问: 求详细代码,JS 真心的没怎么做过 追答:   <input type="button" id=&quo ...

  9. 避免用户重复点击按钮(使用Enable:=False,消息繁忙时会有堵塞的问题,只能改用Sleep)

    // 现象描述://    用户点击按钮后程序开始繁忙工作,这时候用户不知道是否成功,就继续点几次//    采用Enalbe = false ... = true的方式发现还会触发点击,分析原因如下 ...

随机推荐

  1. Axure RP 7.0注册码

    Axure RP 7.0注册码 用户名:axureuser 序列号:8wFfIX7a8hHq6yAy6T8zCz5R0NBKeVxo9IKu+kgKh79FL6IyPD6lK7G6+tqEV4LG   ...

  2. zookeeper_service 出错 ........... are only available on JDK 1.5 and higher

    出错::  ContextLoader:215 ERROR - Context initialization failed org.springframework.beans.factory.Bean ...

  3. JavaScript数组去重

    第一种方法: 思路: 1.创建一个新的数组存放结果 2.创建一个空对象, 3.将数组中的元素作为空对象的属性并对其赋值,每次取出一个元素与对象进行对比,然后到对象中去访问这个属性, 如果能访问到值,则 ...

  4. js储存参数的数组arguments

    js函数中有个储存参数的数组arguments ,所有函数获得的参数会被编译器挨个保存到这个数组中.于是我们的js版支持参数默认值的函数可以通过另外一种变通的方法实现 function simue ( ...

  5. signalr 配置错误跟踪

    <system.diagnostics> <trace autoflush="true" indentsize="4"> <lis ...

  6. UML入门

    本文主要讲解uml的一些入门知识. uml:统一建模语言,uml通过图形化的表达对系统进行细致的划分,在开发前期有助于开发人员与开发人员之间交流,同时也能方便用户与开发者之间进行良好的反馈.利用uml ...

  7. Hadoop学习记录

    http://blog.csdn.net/m_star_jy_sy/article/details/26476907配置windows里eclipse连接hadoop集群 hadoop常见命令 启动H ...

  8. django 强制登录最佳实践

    参考: https://python-programming.courses/recipes/django-require-authentication-pages/ 即通过中间件来做AOP拦截.不用 ...

  9. appium java 环境搭建

    appium是一款open source 移动自动化测试框架,既支持Android 也支持IOS. appium 基于webdriver协议执行测试脚本. 今天,如炒剩饭,介绍一下搭建appium A ...

  10. 【python】安装指定模块

    使用pip 1.卸载模块 sudo pip uninstall xxx 2.安装指定版本模块 sudo pip install xxx==2.0.1.3