工作中遇到的问题(总结)
#pragma mark -- 重新系统方法(目的是为了解决凸起的button没有点击事件) -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { //判断self.isHidden == NO(关键判断)如果不判断,push到其他页,点击这个位置也会触发事件; //self.isHidden == NO 说明当前页有tabbar,在判断手指点击的位置是否发生在按钮身上,如果是的话就让按钮自己去处理事件,不是的话就让系统去处理事件就可以了. if (self.isHidden == NO) { //将当前的tabbar的触摸点转换坐标系,转换到自定义按钮身上,生成一个新的点 CGPoint newP = [self convertPoint:point toView:self.publishButton]; //判断如果这个这个新的点在自定义按钮身上,那么就让按钮自己去处理事件; if ([self.publishButton pointInside:newP withEvent:event]) { return self.publishButton; } else { //如果点不在发布按钮身上,直接让系统处理就好了. return [super hitTest:point withEvent:event]; } } else { //tabbar隐藏了,说明push到其他页面了,这个时候还是让系统去处理就好. return [super hitTest:point withEvent:event]; } }
从今天开始我会将我工作中遇到所有的问题,自己不会的,都会在写在这里面:
有的Bug就一句代码就可搞定掉的,但是自己知道的有限,共同学习,共同成长:
1.拖拽TableView的时候,键盘回收.(一共有3种模式)
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
2.之前写的跳转都是在Vc里面进行的,还有在自定义cell里面需要签协议进行页面之间的跳转,现在不用了,你可以找到你的父视图的Nab去进行跳转了,他里面是do--while 循环找到父视图,然后进行跳转的.
- (UIViewController *)viewController { UIResponder *next = [self nextResponder]; do { if ([next isKindOfClass:[UIViewController class]]) { return (UIViewController *)next; } next = [next nextResponder]; } while (next != nil); return nil; }
然后在你需要跳转的地方写下下面的代码就可以完成页面之间的跳转了:
[[self viewController].navigationController pushViewController:@"想要跳转的Vc" animated:YES];
这样就可以实现了.
16.7.14
今天看了一下以前写的科大讯飞语音,在模拟器上面可以运行,放到真机上面就会出现下面的error:
如果是其他的三方平台也会出现这种错误,你也可以尝试改下Bitcode;
16/07/20:
今天发现个问题就是TextView查看不了层级的问题,一查看层级就会出现:
Assertion failure in -[UITextView _firstBaselineOffsetFromTop], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.60.7/UITextView.m:1683;
后来在tackoverflow 中找到解决办法;
http://stackoverflow.com/questions/37068231/assertion-failure-in-uitextview-firstbaselineoffsetfromtop;
就是需要给 textView 创建一个类目, 然后完成这两个方法就可以了。
OC版:
@interface UITextView(MYTextView) @end @implementation UITextView (MYTextView) - (void)_firstBaselineOffsetFromTop { } - (void)_baselineOffsetFromBottom { } @end Swift版: extension UITextView { func _firstBaselineOffsetFromTop() { } func _baselineOffsetFromBottom() { } } 这样就可以解决这个问题了.
7.27 在今天发现我的项目中所有的NSLog打印,都打不出来结果,原因工程的模式为DeBug模式,切换到Release;就可以了;
提示手机进行振动:
- (void)vibrate { AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); }
设置屏幕在哪些情况下进行长亮设置:
[[UIApplication sharedApplication] setIdleTimerDisabled:YES]; // 设置播放时屏幕常亮
删除view上面的所有子视图:
[self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
2016.08.05 今天在开发者网站上下载证书,提示如下:
证书没有认证:
证书下载地址:
https://developer.apple.com/certificationauthority/AppleWWDRCA.cer;
点击链接,下载证书,安装即可.我们自己安装的证书放在钥匙串的登陆里面,是苹果的要放在系统里面.
2016.08.09 在昨天收到了App被拒的消息,原因如下:
意思是缺少一写隐私,例如举报,修改之后重新上传了,然后就进行了加急审核,建议不要使用加急审核,如果你需要的话,可以看下面这篇简书:
http://www.jianshu.com/p/b359fcf3383b;
UITextField常用的键盘属性如:键盘类型, 安全输入等. 其实这些属性并不是UITextField特有的属性, 而是UITextInputTraits协议属性(一共有8个属性).
给UILabel赋HTML5值:
NSString*htmlString = @"<h1>Header</h1><h2>Subheader</h2><p>Some <em>text</em></p><img src='http://blogs.babble.com/famecrawler/files/2010/11/mickey_mouse-1097.jpg' width=70 height=100 />"; NSAttributedString*attributedString = [[NSAttributedStringalloc] initWithData:[htmlString dataUsing Encoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType} d ocumentAttributes:nilerror:nil]; textView.attributedText = attributedString;
将文字转化成拼音:
NSString *_name = @“你么好”; NSMutableString *pinyin = [_name mutableCopy]; //转换成拼音 CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformMandarinLatin, NO); //去掉音调 CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformStripDiacritics, NO); NSLog(@"pinyin= %@",pinyin); // 截取首字母 NSString * first = [pinyin substringToIndex:1]; NSLog(@"%@", first);
去除收尾字符串:
NSString *str = @" Liu "; str = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
2016.8.31 今天工作工作遇到中文转码成GBK:
NSString *pageSource = [[NSString alloc] initWithData:pageData encoding:NSUTF8StringEncoding]; 如果网页是gbk(或者gb2312),用UTF8转换的话,pageSource返回nil。这时需要使用gbk编码做转换,但是NSStringEncoding不含gbk,怎么办?用另一个方法处理一下: NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); NSString *pageSource = [[NSString alloc] initWithData:pageData encoding:gbkEncoding];
2016.09.21 遇到下面这种情况就是不能使用模拟器运行,的使用真机
2016.09.28 页面进行跳转的时候,push,返回按钮一定要自定义,不要用新系统的,太low爆了.
今天真机测试出现这个错误: The certificate used to sign "Programming" has either expired or has been revoked. An updated certificate is required to sign and install the application. 就是说你的证书被别人删除或者是无效的, 解决方法: 1. command + , 2. 选择第二个选项 Accounts 3. 在点击 View Details... 4. 选择第一个 iOS Development Reset 等待就可以了
#import "UINavigationBar+Click.h" @implementation UINavigationBar (Click) -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { self.userInteractionEnabled = [self pointInside:point withEvent:event]; return [super hitTest:point withEvent:event]; } @end
#pragma -- mark -- 切换根视图控制器动画 [UIView transitionWithView:[[UIApplication sharedApplication].delegate window] duration:0.4 options:UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionCurveEaseInOut animations:^{ BOOL oldState = [UIView areAnimationsEnabled]; [UIView setAnimationsEnabled:NO]; WYSLoginViewController *loginVc = [[WYSLoginViewController alloc]init]; WYSCustomNavigationController *naVc = [[WYSCustomNavigationController alloc]initWithRootViewController:loginVc]; [UIApplication sharedApplication].keyWindow.rootViewController = naVc; [UIView setAnimationsEnabled:oldState]; } completion:^(BOOL finished) { }];
#pragma mark -- 开发中我们需要指定切角为圆角,就可以用下面的方法实现. 1.如果是切四个角的圆角,代码示例: self.picImage.layer.cornerRadius = 8; self.picImage.layer.masksToBounds = YES; 2.如果是四个角中的某几个角,一个,两个,或者3个,代码示例(切的左下,和右下): UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.tipLabel.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(5, 5)]; CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; maskLayer.frame = _tipLabel.bounds; maskLayer.path = maskPath.CGPath; self.tipLabel.layer.mask = maskLayer; 类型共有以下几种: * UIRectCornerTopLeft * UIRectCornerTopRight * UIRectCornerBottomLeft * UIRectCornerBottomRight * UIRectCornerAllCorners
2017--04--10 //这个是切换根视图控制器动画 [UIView transitionWithView:[[UIApplication sharedApplication].delegate window] duration:1.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ BOOL oldState = [UIView areAnimationsEnabled]; [UIView setAnimationsEnabled:NO]; WYSLoginViewController *loginVc = [[WYSLoginViewController alloc]init]; UINavigationController *naVc = [[UINavigationController alloc]initWithRootViewController:loginVc]; [UIApplication sharedApplication].keyWindow.rootViewController = naVc; [UIView setAnimationsEnabled:oldState]; } completion:^(BOOL finished) { }]; } //开发中遇到问题是很正常的,不要去抱怨,那是因为自己的技术还是不够成熟,你要用心去看,当你解决一个Bug的时候是非常开心的😁. 今天做登陆部分的细节处理,发现在退出登录的时候,登陆的页面向下偏移64px,我就很纳闷,这是为什么啊?为了解决这个Bug,我在退出的时候发送通知去改变登陆View的frame,发现效果不错,还挺好,在进行跳转的时候又是一堆Bug,我就闹心了,后来看了一下,我这个框架是我自定义tabbar,并且设置了navBar的背景图片,而在切换根式图的时候,其他根式图没有设置导航栏的背景图片,导致frame的偏移.后来在设置登陆的背景图片就好了. (坑会越才越少的, come on);
2017-04-11 公司让做支付,因为本身项目就有支付,在添加静态库.a的时候发现.a中和之前做支付的.a文件存在相同的文件,导致文件冲突,上网查一下资料,很复杂,也有点萌萌哒,一个很简单的解决方法看下面这张图片就可以了:
在第5步添加的时候,就是添加路径,例如: 项目名称/文件名/.a 这样就可以了,不用谢哈.
开发中常用到if--else来进行逻辑判断,我在collectviewHeader中给头视图添加子视图,判断是第几个分区,添加什么样的视图,我用 if -- else if 进行判断,导致了头视图重用了,就是没有使用else,要记得使用if判断的时候一定要对应else.(是一个习惯问题);
2017-06-19 :
这个就是push很多页面,然后POP回到指定页面,AViewController就是你pop回去的指定的页面.
for (UIViewController *controller in self.navigationController.viewControllers) { if ([controller isKindOfClass:[AViewController class]]) { AViewController *A =(AViewController *)controller; [self.navigationController popToViewController:A animated:YES]; } }
使用GCD解决,一个页面请求多个接口数据问题:
方法1.
- (void)groupTest { dispatch_queue_t quete = dispatch_queue_create("XIAXIAQUEUE", DISPATCH_QUEUE_CONCURRENT); dispatch_group_t group = dispatch_group_create(); dispatch_group_enter(group); dispatch_group_async(group, quete, ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ sleep(5); NSLog(@"网络任务1完----%@", [NSThread currentThread]); dispatch_group_leave(group); }); sleep(2); NSLog(@"任务1完成---%@", [NSThread currentThread]); }); // dispatch_group_wait(group, DISPATCH_TIME_FOREVER); dispatch_group_enter(group); dispatch_group_async(group, quete, ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ sleep(5); NSLog(@"网络任务2完成----%@", [NSThread currentThread]); dispatch_group_leave(group); }); sleep(2); NSLog(@"任务2完成---%@", [NSThread currentThread]); }); // dispatch_group_wait(group, DISPATCH_TIME_FOREVER); dispatch_group_enter(group); dispatch_group_async(group, quete, ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ sleep(5); NSLog(@"网络任务3完成 --- %@", [NSThread currentThread]); dispatch_group_leave(group); }); sleep(2); NSLog(@"任务3完成---- %@", [NSThread currentThread]); }); dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"最后执行 ---- %@", [NSThread currentThread]); }); }
方法2.
dispatch_group_t group = dispatch_group_create(); dispatch_async(dispatch_get_global_queue(0, 0), ^{ for (int i = 0; i < 2; i ++) { dispatch_group_enter(group); switch (i) { case 0: { //网络请求 [self getProductDetailsSuccess:^(BOOL success){ //回调执行 dispatch_group_leave(group); }]; } break; case 1: { //网络请求 [self getProductEvaluateSuccess:^(BOOL success) { //回调执行 dispatch_group_leave(group); }]; } break; default: break; } } //线程等待 dispatch_group_wait(group, DISPATCH_TIME_FOREVER); dispatch_async(dispatch_get_main_queue(), ^{ //请求完毕,处理业务逻辑 }); });
问题: 如果软件启动出现文件损坏 如何操作?
打开终端 ( 终端在 应用程序 - 实用工具内 )
然后蓝色内容粘贴下面的内容到窗口内 回车
sudo spctl --master-disable
这个时候就会出现:安全性与隐私->选择任何来源:
自签名的过程: 不需要打开Xcode工程 把我提供的zip中libLocationFaker用代码重新签名 把.app放到Payload文件夹,压缩成.ipa 用码/ fastlane / iresign等工具重新签名注意:如果证书的BundleID不是*,需要修改Info.plist中的BundleID iTunes / iTools / Xcode安装ipa,推荐用Xcode安装,大多数安装失败会提示原因。
修改系统相册,文字大小,返回按钮颜色:
#pragma mark -- 修改系统相机导航栏样式 -(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController* )viewController animated:(BOOL)animated{ if ([navigationController isKindOfClass:[UIImagePickerController class]]){ viewController.navigationController.navigationBar.translucent = NO; viewController.edgesForExtendedLayout = UIRectEdgeNone; viewController.navigationController.navigationBar.barTintColor = [UIColor clearColor]; //title颜色和字体 viewController.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:[UIColor whiteColor], NSFontAttributeName:[UIFont systemFontOfSize:18]}; viewController.navigationItem.rightBarButtonItem.tintColor = [UIColor whiteColor]; viewController.navigationItem.leftBarButtonItem.tintColor = [UIColor whiteColor]; viewController.navigationController.navigationBar.tintColor = [UIColor whiteColor]; } }
此方法利用反射可以判断实体类那些字段为空:
List<String> list=new ArrayList<String>(); Products products=new Products(); Field[] field =products.getClass().getDeclaredFields(); for (int i=0;i<field.length;i++){ String name = field[i].getName(); name = name.substring(0,1).toUpperCase()+name.substring(1); //将属性的首字符大写,方便构造 if(name.contains("_requir")){ Method m = products.getClass().getMethod("get"+name); String value = (String) m.invoke(products);//调用getter方法获取属性值 if(value!=null){ list.add(value); }else{ return name+"不能为空"; } }
TableView滚动到最顶端: [mainTableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES]; 或者 [mainTableView setContentOffset:CGPointZero animated:YES]; Swift: mainTableView.setContentOffset(CGPointZero, animated:true) 作者:Jafar 链接:http://www.jianshu.com/p/21b569367548 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
#pragma mark -- 点击tableBar动画 - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { NSLog(@"item name = %@", item.title); NSInteger index = [self.tabBar.items indexOfObject:item]; [self animationWithIndex:index]; if([item.title isEqualToString:@"发现"]) { // 也可以判断标题,然后做自己想做的事<img alt="得意" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/proud.gif" /> } } - (void)animationWithIndex:(NSInteger) index { NSMutableArray * tabbarbuttonArray = [NSMutableArray array]; for (UIView *tabBarButton in self.tabBar.subviews) { if ([tabBarButton isKindOfClass:NSClassFromString(@"UITabBarButton")]) { [tabbarbuttonArray addObject:tabBarButton]; } } CABasicAnimation*pulse = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; pulse.timingFunction= [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; pulse.duration = 0.2; pulse.repeatCount= 1; pulse.autoreverses= YES; pulse.fromValue= [NSNumber numberWithFloat:0.8]; pulse.toValue= [NSNumber numberWithFloat:1.2]; [[tabbarbuttonArray[index] layer] addAnimation:pulse forKey:nil]; }
工作中,Tabbar中间的按钮是自定义的,点击之后模态出来一个页面,在点击页面上面的按钮Push到下一页,在下一页进行调起系统相册,这时候会报一个错:Warning: Attempt to present <XXXXPickerController: 0x7fda7d036c00> on <XXXXTabBarController: 0x7fda7bc4fdf0>
whose view is not in the window hierarchy!下面这个方法就可以解决这个问题, 意思就是模态出来的VC没有在Window上面,也就是没有根视图.
//取当前最上面的presentedViewController UIViewController * topVc = [UIApplication sharedApplication].keyWindow.rootViewController; while (topVc.presentedViewController) { topVc = topVc.presentedViewController; } [topVc presentViewController:picker animated:YES completion:nil];
查看工程中的第三方是否使用IDFA: 1.用终端cd到项目目录. 2.grep -r advertisingIdentifier . (注意后面这个 "." 一定要有啊!!!!)
//搜索关键字高亮: #pragma mark -- 关键字高亮 - (NSAttributedString *)highlightText:(NSString *)keyword inStr:(NSString *)str { NSRange range = [str rangeOfString:keyword]; NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc]initWithString:str]; if (range.length > 0) { [attrStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range]; } else { [attrStr addAttribute:NSForegroundColorAttributeName value:[UIColor darkGrayColor] range:range]; } return [[NSAttributedString alloc]initWithAttributedString:attrStr]; }
//获取字符串中的电话号码 NSString *regulaStr = @"\\d{3,4}[- ]?\\d{7,8}"; NSRange stringRange = NSMakeRange(0, ridePhoneNum.length); //正则匹配 NSError *error; NSMutableAttributedString *str = [[NSMutableAttributedString alloc]initWithString:ridePhoneNum]; NSRegularExpression *regexps = [NSRegularExpression regularExpressionWithPattern:regulaStr options:0 error:&error]; if (!error && regexps != nil) { [regexps enumerateMatchesInString:ridePhoneNum options:0 range:stringRange usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) { NSRange phoneRange = result.range; //定义一个NSAttributedstring接受电话号码字符串 _phoneNumber = [str attributedSubstringFromRange:phoneRange]; //添加下划线 NSDictionary *attribtDic = @{NSUnderlineStyleAttributeName: [NSNumber numberWithInteger:NSUnderlineStyleSingle]}; [str addAttributes:attribtDic range:phoneRange]; //设置文本中的电话号码显示为黄色 [str addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:phoneRange]; _labelManIphoneNumShow.attributedText = str; _labelManIphoneNumShow.userInteractionEnabled = YES; //添加手势,可以点击号码拨打电话 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGesture:)]; [_labelManIphoneNumShow addGestureRecognizer:tap]; }]; }
//解决UIScroller与FDFullscreenPopGesture 手势冲突, 意思是scroller的偏移量<=0的时候,让他去响应_FDFullscreenPopGestureRecognizerDelegate - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if (self.contentOffset.x <= 0) { if ([otherGestureRecognizer.delegate isKindOfClass:NSClassFromString(@"_FDFullscreenPopGestureRecognizerDelegate")]) { return YES; } } return NO; }
获取当前屏幕显示的VC: +(UIViewController *)getCurrentVC { UIViewController *result = nil; UIWindow *window = [[UIApplication sharedApplication] keyWindow]; if (window.windowLevel != UIWindowLevelNormal) { NSArray *windows = [[UIApplication sharedApplication] windows]; for (UIWindow *tmpWin in windows) { if (tmpWin.windowLevel == UIWindowLevelNormal) { window = tmpWin; break; } } } UIView *frontView = [[window subviews] objectAtIndex:0]; id nextResponder = [frontView nextResponder]; if ([nextResponder isKindOfClass:[UIViewController class]]) result = nextResponder; else result = window.rootViewController; return result; }
日期验证: NSString *regex = @"([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}).(((0[13578]|1[02]).(0[1-9]|[12][0-9]|3[01]))|((0[469]|11).(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))";
// (([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}).(((0[13578]|1[02]).(0[1-9]|[12][0-9]|3[01]))|((0[469]|11).(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00)).02.29) NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex]; if ([pred evaluateWithObject:str]) { return YES; } return NO;
处理HTML文字,去除标签,窃取字符串 NSString *htmlString = [self getNormalStringFilterHTMLString:_content]; NSArray *firArray = [htmlString componentsSeparatedByString:@"【"]; for (NSString *NextStr in firArray) { if ([NextStr isEqualToString:@""] || NextStr == nil) { } else { WYSGoodsDetailProductManualModel *model = [[WYSGoodsDetailProductManualModel alloc]init]; NSArray *lastArray = [NextStr componentsSeparatedByString:@"】"]; model.titelMa = [lastArray firstObject]; model.contentMa = [lastArray lastObject]; [_arrayKey addObject:model]; } } [self.tableViewManual reloadData]; //对字符串进行处理 -(NSString *)getNormalStringFilterHTMLString:(NSString *)htmlStr{ NSString *normalStr = htmlStr.copy; //判断字符串是否有效 if (!normalStr || normalStr.length == 0 || [normalStr isEqual:[NSNull null]]) return nil; //过滤正常标签 NSRegularExpression *regularExpression=[NSRegularExpression regularExpressionWithPattern:@"<[^>]*>" options:NSRegularExpressionCaseInsensitive error:nil]; normalStr = [regularExpression stringByReplacingMatchesInString:normalStr options:NSMatchingReportProgress range:NSMakeRange(0, normalStr.length) withTemplate:@""]; //过滤占位符 NSRegularExpression *plExpression=[NSRegularExpression regularExpressionWithPattern:@"&[^;]+;" options:NSRegularExpressionCaseInsensitive error:nil]; normalStr = [plExpression stringByReplacingMatchesInString:normalStr options:NSMatchingReportProgress range:NSMakeRange(0, normalStr.length) withTemplate:@""]; //过滤空格 NSRegularExpression *spaceExpression=[NSRegularExpression regularExpressionWithPattern:@"^\\s*|\\s*$" options:NSRegularExpressionCaseInsensitive error:nil]; normalStr = [spaceExpression stringByReplacingMatchesInString:normalStr options:NSMatchingReportProgress range:NSMakeRange(0, normalStr.length) withTemplate:@""]; return normalStr; }
持续更新............