首页
网站首页
公司简介
资讯中心
推荐内容
返回顶部
iOS开发遇到的问题及解决办法,防止Button重复点击的两种方法
发布时间:2020-04-22 01:19
浏览次数:

我这边是对字符串写了个类别,我主要的思路是先判断字符串是不是含有表情符号,我的表情符号的定义是这样的[得意]

假设,当点击一个页面中的某个Button,会Push到另一个页面。如果你的手速太快【比如你也像我一样20多年单身练就一把好手速【比如你遇到了谜一样的测试队友【比如你的客户反馈了下面的问题:短时间内点击了两次Button,结果执行了两次Push操作。如果你并不打算为你的APP埋下诸如上面这样的彩蛋,那最好就避免这样的行为。

<h5>1、TableView不显示没内容的Cell怎么办?</h5>

CAGradientLayer *layer = [CAGradientLayer layer];

图片 1得意@2x.png

这里给出两种解决方案

 self.tableView.tableFooterView = [[UIView alloc] init];

layer.startPoint = CGPointMake;//表示从左上角开始变化。默认值是表示从x轴为中间,y为顶端的开始变化

然后图片名称也是一样的名字,在遍历字符串时可以将含有表情字符的找到装到一个数组中代码如下

第一种:从Button的enable状态入手。

这个是比较轻量级的解决办法,思路就是如果点击了这个button,那就让这个button在一个规定时间内无法继续点击。是针对单个Button的操作。技能前摇:创建UIButton Category->将Category导入全局(.pch文件,或者rootVC等等)->打开这个Category的.m文件依次重写三个方法:

- willMoveToSuperview:newSuperview { [super willMoveToSuperview:newSuperview]; [self addTarget:self action:@selector(buttonStartClick:) forControlEvents:UIControlEventTouchUpInside];}- buttonStartClick:sender { self.button.enabled = NO; [self performSelector:@selector(changeButtonStatus) withObject:nil afterDelay:0.5f];}- changeButtonStatus { self.button.enabled = YES;}

原理就是在这个button被加载的时候添加一个target,当被点击的时候通过设置enable来使其在之后的0.5秒内无法被点击。该方法借鉴自button防止被重复点击的相关方法

<h5>2、自定义了leftBarbuttonItem左滑返回手势失效了怎么办?</h5>

layer.endPoint = CGPointMake;//表示到右下角变化结束。默认值是 表示从x轴为中间,y为低端的结束变化

 -getMessageRange:(NSString*)message :(NSMutableArray*)array { NSRange rangeL = [message rangeOfString:@"["]; NSRange rangeR = [message rangeOfString:@"]"]; //判断当前字符串是否还有表情的标志。 if (rangeL.length && rangeR.length) { if (rangeL.location > 0) { [array addObject:[message substringToIndex:rangeL.location]]; [array addObject:[message substringWithRange:NSMakeRange(rangeL.location, rangeR.location + 1 - rangeL.location)]]; NSString *str = [message substringFromIndex:rangeR.location + 1]; [self getMessageRange:str :array]; } else { NSString *nextstr = [message substringWithRange:NSMakeRange(rangeL.location, rangeR.location + 1 - rangeL.location)]; //排除“”空字符串 if (![nextstr isEqualToString:@""]) { [array addObject:nextstr]; NSString *str = [message substringFromIndex:rangeR.location + 1]; [self getMessageRange:str :array]; } else { return; } } } else { [array addObject:message]; }}
第二种:设置View的userInteractionEnabled

上一种方法的优势是只是对button对象进行了设置,不会对其他元素产生影响。当一个页面有多个元素都可以被点击(比如一个Image的单击手势)的时候,我们点击了其中一个之后,在同一时间不希望其他元素也被点击,这种时候对单一的Button设置可能会无法完成需求。以下代码可以解决上面描述的问题。技能前摇和方法一相同,都是在UIButton的category里面进行设置。

- willMoveToSuperview:newSuperview { [super willMoveToSuperview:newSuperview]; [self addTarget:self action:@selector(buttonStartClick:) forControlEvents:UIControlEventTouchUpInside];}- buttonStartClick:sender { [UIApplication sharedApplication].keyWindow.userInteractionEnabled = NO; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [UIApplication sharedApplication].keyWindow.userInteractionEnabled = YES; });}- checkWindowUserInteractionEnabledWhenRemoveFromSuperview { if ([UIApplication sharedApplication].keyWindow.userInteractionEnabled) return; [UIApplication sharedApplication].keyWindow.userInteractionEnabled = YES;}- removeFromSuperview { [super removeFromSuperview]; [self checkWindowUserInteractionEnabledWhenRemoveFromSuperview];}

原理是当点击了button的时候,使整个Window的userInteractionEnabled在0.5秒内为NO。

如果你对上面两种方法有疑问,或者有更好的方法,欢迎在下方的评论区探讨~。

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;

layer.colors = [NSArray arrayWithObjects:[UIColor blueColor].CGColor,[UIColor redColor].CGColor,[UIColor greenColor].CGColor, nil];

然后在这个数组中查找符合表情符号的字符,如果是你工程中匹配的表情符合就输出表情,否则输出字符串

<h5>3、ScrollView莫名其妙不能在viewController划到顶怎么办?</h5>

layer.locations = @[@0.0f,@0.6f,@1.0f];//渐变颜色的区间分布,locations的数组长度和color一致,这个值一般不用管它,默认是nil,会平均分布

- (NSAttributedString *)emojiStr { @try { NSMutableArray *imageArr = [NSMutableArray arrayWithCapacity:0]; [self getMessageRange:self :imageArr]; //NSLog(@"%@",imageArr); NSMutableAttributedString *mutableAttributedStr=[[NSMutableAttributedString alloc]initWithString:@""]; [imageArr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSString *contentPartStr = [NSString stringWithFormat:@"%@",obj]; if (contentPartStr.length > 0) { NSString *firstC = [obj substringWithRange:NSMakeRange]; NSString *endC = [obj substringWithRange:NSMakeRange(1, contentPartStr.length-1)]; NSAttributedString *attributedStr; if ([firstC isEqualToString:@"[" ]&&[endC rangeOfString:@"]" ].location!=NSNotFound ) { NSRange firstRange = [obj rangeOfString:@"["]; NSRange secondRange = [obj rangeOfString:@"]"]; NSUInteger length = secondRange.location - firstRange.location; NSRange imageNameRange = NSMakeRange(1, length - 1); NSString *imageName = [obj substringWithRange:imageNameRange]; NSTextAttachment *attachment = [[NSTextAttachment alloc]init]; attachment.image = [UIImage imageNamed:imageName]; if (attachment.image==nil) { attributedStr = [[NSAttributedString alloc]initWithString:[NSString stringWithFormat:@"[%@]",imageName]]; // NSLog(@"%@",imageName); }else{ attachment.bounds = CGRectMake(0, 0, 20, 20); attributedStr = [[NSAttributedString alloc]initWithString:@""]; attributedStr = [NSAttributedString attributedStringWithAttachment:attachment]; }} else{attributedStr = [[NSAttributedString alloc]initWithString:obj]; } [mutableAttributedStr appendAttributedString:attributedStr]; } }]; return mutableAttributedStr; } @catch (NSException *exception) { NSLog(@"%@",exception); } @finally { }}
 self.automaticallyAdjustsScrollViewInsets = NO;

layer.frame = self.view.layer.bounds;

代码中的@try@catch@finally的关键字是将可能引发异常的代码节放在 Try 块中,而将处理异常的代码放在 Catch 块中。Catch 块是一系列以关键字 catch 开头的语句,语句后跟异常类型和要执行的操作。异常发生时,执行将终止,并且控制交给最近的异常处理程序。这通常意味着不执行希望总是调用的代码行。有些资源清理必须总是执行,即使有异常发生。为实现这一点,可以使用 Finally 块。Finally 块总是执行,不论是否有异常发生。

<h5>4、怎么在不新建一个Cell的情况下调整separaLine的位置?</h5>

[self.view.layer insertSublayer:layer atIndex:0];

本文中的方法不是很完善,像这两种表情字符串无法正常解析[[得意]],[字符串[得意]。但是都做了处理程序不会崩溃,后期改正后再更新。

 _myTableView.separatorInset = UIEdgeInsetsMake(0, 100, 0, 0);

让其中navigationBar进行逐步的渐变.

思路一样只是封装的不一样。

<h5>5、怎么点击self.view就让键盘收起,需要添加一个tapGestures么?</h5>

友情链接: 网站地图
Copyright © 2015-2019 http://www.nflfreepicks.net. 新葡萄京娱乐场网址有限公司 版权所有