iOS里防止按钮被多次点击的办法

原理:利用局部变量生存期局限在当前函数或者当前代码块的原理,实现C++里AutoLock的概念,其实也就是智能指针的概念.

利用局部变量在创建时执行按钮的setEnable为NO,在函数结束,且无block的情况下setEnable为YES.如果有block,需要调下blockIt函数,其实里面啥都不干,就是为了让LLVM知道这个变量要在block结束后才释放.

头文件

@interface D1AutoDisableButton : NSObject
{
    UIButton* sender;
}
//调用接口,声明一个临时变量,注意不能是全局的或者self成员级的,如果要跨函数调用,请将其作为参数传递
+(id)objectWithButton:(UIButton*)obj;
//在block里随便做点什么,不然变量就在block执行前就释放了.
-(void)blockIt;
@end

实现

@implementation D1AutoDisableButton

-(id)init
{
    [super doesNotRecognizeSelector:_cmd];
    return nil;
}
+(id)objectWithButton:(UIButton*)obj
{
    D1AutoDisableButton* lockObj = [[D1AutoDisableButton alloc]initWithParam:obj];
    return lockObj;
}
-(id)initWithParam:(UIButton*)obj
{
    sender = obj;
    [sender setEnabled:NO];
//    NSLog(@"auto disable:%x",sender);
    return self;
}
-(void)dealloc
{
    [sender setEnabled:YES];
    //NSLog(@"auto enable:%x",sender);
}
-(void)blockIt
{
    //NSLog(@"block call it");
}
@end

使用了ARC

时间: 2024-10-10 14:51:53

iOS里防止按钮被多次点击的办法的相关文章

ios禁用多按钮同时点下的bug

如果界面上有多个按钮的话,当你同时点击这几个按钮,会同时出发多个方法,再如果你的action进行了界面跳转,则会出现一个bug,你不信的话,可以试试... 之前有想过解决方法,第一种就是设置一个全局变量,当点击的时候将bool值设置为yes,在方法的最后再设置回来,这样的话是一件非常麻烦的事情:后来发现苹果对此已经有相关的解决方案:[btn setExclusiveTouch:YES]; ios禁用多按钮同时点下的bug,布布扣,bubuko.com

iOS 添加导航按钮

iOS设置导航按钮navigationBar中包含了这几个重要组成部分:leftBarButtonItem, rightBarButtonItem, backBarButtonItem, title.下面是代码 //设置右Btn UIButton *rightBtn = [[UIButton alloc] initWithFrame:CGRectMake(2, 2, 40, 40)]; [rightBtn setTitle:@"搜索" forState:UIControlStateNo

Layer For Mobile 弹窗 input输入文字后,点击取消确定按钮失效(需点击两次)

webapp中使用Layer For Mobile弹出弹窗,修改昵称输入文字后,ios手机中,如果不先点击收起键盘,两个按钮点击之后无效... 两个按钮的方法是写在这里的--> 最后只能吧点击按钮click事件单拎出来...发现还是会无效. 那就只能试下touchstart...发现可以了. 解决办法:layer按钮点击事件拎出来写,并且使用touchstart方法: 代码如下: 注意:如果click与touch事件混用,也许会造成点击穿透. 原文地址:https://www.cnblogs.c

Flutter“不能热加载(hot reload),热重载按钮灰色且无法点击”的解决方案

前言,Flutter的热重载(hot reload)功能可以帮助您在无需重新启动应用的情况下快速.轻松地进行测试.构建用户界面.添加功能以及修复错误. 通过将更新后的源代码文件注入正在运行的Dart虚拟机(VM)中来实现热重载. 在虚拟机使用新的的字段和函数更新类后,Flutter框架会自动重新构建widget树,以便您快速查看更改的效果. 要热重载一个Flutter应用程序: 从受支持的IntelliJ IDE .Android Studio 或终端窗口运行应用程序.物理机或虚拟器都可以运行.

小功能——类似微信里,评论内容里面,点击每个人的用户名进入个人主页

项目里的朋友圈页面,每幅图片的评论内容里面,有不同的用户进行评论,起初想法是点击用户名直接进行回复,后来看微信都是点击评论内容进行回复评论的发起人,这个好做,把这个textview绑定一个监听器就ok了 后来再一想,如果要实现类似微信点击用户名就进入用户的主页,怎么让用户名可以点击呢? 现在父布局下面在new一个水平布局的linearlayout,然后根据把每个用户.包括评论内容都设置进textview里面,然后通过linearlayout的addview()方法,把这些textview添加进去

后台找到repeater里面的div并添加客户端点击事件

public partial class Inv_SelectWorkservice : System.Web.UI.Page,IPostBackEventHandler{ } 通过OnItemCreated 找到repeater里面的div并添加客户端点击事件div要加上runat="server" id="itemTy" onclick="test" 后台: protected void Repeater2_ItemCreated(objec

ios 判断字符串为空和只为空格解决办法

ios 判断字符串为空和只为空格解决办法- (BOOL)isBlankString:(NSString *)string{ if (string == nil) { return YES; } if (string == NULL) { return YES; } if ([string isKindOfClass:[NSNull class]]) { return YES; } if ([[string stringByTrimmingCharactersInSet:[NSCharacterS

前端防止按钮被多次点击

前端的部分逻辑有时候控制前端的显示,比如记录收藏数目等等.有时候多次重复点击会造成前端显示的bug.所以需要有部分逻辑判断去筛除掉重复多次的点击. 实现部分代码如下,主要是通过setTimeout去加以判断,即无论点击几次,间隔一定时间才会去触发一次事件,从而只产生一次的记录: <script> var i=0; //判断点击次数寄存 var closetimer = null; //延时函数寄存 function Button1_Click() //botton点击事件 { console.

android 读取DDMS里的文件时打不开,解决办法

1.问题:安卓自带数据库SQLite数据读取时(ddms---data----data----yourprojectname----databases),当点击data时目录展不开.从而无法查看数据库表中的数据. 2.方法:第一获得ROOT权限,如何获得root权限?我下载了一个一键root工具,挺好用的 (muzisoft.exe)安装在电脑上,并连接手机.点击一键root,等几分钟即可. 3.修改要查看文件的权限,下载一个RE(R.E管理器)并安装在手机上,运行,长按要查看的文件,在弹出的列