Xcode Workspace就如同工厂, Xcode Project如同车间,每个车间可以独立于工厂来生产产品( project可独立于 workspace存在),但是各个车间组合起来就需要工厂来组织(如果用了 cocopods,就需要用 workspace)。 Xcode Target是一条条的流水线,一条流水线上面只生产一种产品。 Build Settings是生产产品的秘方,如果是生产汽水, Build settings就是其中各个原料的配方。 Xcode scheme是生产方案,包含了流水线生产,秘方,还包含生产完成之后的质检(test)
1> iOS 真机测试包路径:
点击->前往->前往文件夹 : /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
2> 超级头文件Pch 配置:Build Settings ->prefix header :$(SRCROOT)/工程名/类名
3>Bitcode设置:
Bitcode is an intermediate representation of a compiled program. Apps you upload to iTunes Connect that contain bitcode will be compiled and linked on the App Store. Including bitcode will allowApple to re-optimize your app binary in the future without the need to submit anew version of your app to the store.
说的是bitcode是被编译程序的一种中间形式的代码。包含bitcode配置的程序将会在App store上被编译和链接。bitcode允许苹果在后期重新优化程序的二进制文件,而不需要重新提交一个新的版本到App store上。
bitcode选项默认是设置为YES的。我们可以在”Build Settings”->”Enable Bitcode”->设置为No
Other Linker Flags设置
unrecognized selector sent to class 0x117e7c858 类扩展的坑
错误原因:Other Linker Flags 链接设置错误导致类扩展不知道如何正确读取,找不到类方法而产生的错误。
发证这个Bug的原因主要是因为写了扩展类之后没有在TATGETS->Build Settings->Other Linker Flags 里边添加正确的链接或者根本没添加链接,一般而言,如果是自己在项目中写扩展类,运行时都会自动添加的,如果这种情况实在是出了问题,那就自个儿在Xcode左边文件目录栏把对应的扩展方法文件拖进Other Linker Flags里边,它会自动生成链接的,绝对比你自己写的地址准确。但是如果是接入的静态库或者动态库,你就没有办法了,所以这个时候需要在Other Linker Flags后边添加"-all_load"、"-ObjC"、“-force _load”
关于这三个的使用场景,因为我自己使用"-all_load"后问题就解决了,所以我觉得我的这个问题可能不足以测试出这三者的区别
https://www.jianshu.com/p/7579eda7cbef
4>微信支付处理和友盟库冲突
//点击工程->Build Settings -> Library Search Paths 删除不引用的库 解决冲突
5.XCode环境变量及路径设置
一般我们在xcode里面配置包含工程目录下头文件的时候,都要关联着相对路径和绝对路径,如果只是自己用这个项目,用绝对路径的问题不大,但是如果你把工程发给别人,别人就要在改这个绝对路径,这时候绝对路径的缺点立马出现。
所以在修改User Header Search Paths这个选项的时候使用"$(SRCROOT)/当前工程名字/需要包含头文件所在文件夹"
将上面的双引号里面的字符串拷贝之后,你会发现这个“$(SRCROOT)”,会自动变成当前工程下的目录。这样就可以了,发给别人,别人也不用在去修改路径了。
$(SRCROOT)/include/**表示根目录include目录下所有头文件
6.userInteractionEnabled属性:设置为NO,在其下面的层级不会受影响,再其上面的控件、按钮无法点击;设置为YES,则可以点击。
例如:bgScrollView在视图最底层,上面加的是bgView, shadowView先添加在bgView, UIButton后添加在bgView上,此时按钮可以点击。
7.代码块添加方式
注释语法格式:<#代码块内容#>
尖括号—两个#号—中间是可添加的注释
8.导航条字体样式设置
// 1.设置左右两个Baritem 的字体颜色 self.navigationController.navigationBar.tintColor = [UIColor redColor]; // 2.设置标题字体大小和文本颜色 [self.navigationController.navigationBar setTitleTextAttributes: @{NSFontAttributeName:[UIFont systemFontOfSize:19], NSForegroundColorAttributeName:[UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1]}]; // 3.设置导航条的背景颜色 self.navigationController.navigationBar.barTintColor = [UIColor blueColor];
9.第一次进入某个页面设置键盘弹出
[self performSelector:@selector(showKeyboard) withObject:nil afterDelay:0]; - (void)showKeyboard { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [_inputTopic becomeFirstResponder]; }); }
10.交换两个按钮的位置
CGRect rect; rect = button.frame; button.frame = button01.frame; button01.frame = rect;
11.字符串Url汉字转化
NSString * str = @"下午上课了"; // [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
12.给应用添加自定义字体
//1.找到系统的字体册,ShowInFinder一下,找到自己想要的字体,拖入到工程中去() //2.在Info.plist文件中添加Key值 Information Property List->Fonts provided by application->item0 string->双击添加(XingKai.ttc)WawaSC-Regular.otf //3.在ViewDidLoad里面遍历输出FamilyName for (NSString * str in [UIFont familyNames]) { NSLog(@"%@",str); } //4.使用 A label 设置字体 label.font = [UIFont fontWithName:@“XingKai SC” size:30]; A label 设置字体粗细 label.font = [UIFont boldSystemFontOfsize:30]; B Button 设置字体 button.titleLabl.font = [UIFont fontWithName:@“XingKai SC” size:30];
13.延时调用的方法是什么?如何取消延时调用?
//触发延时调用 self performSelector: [self performSelector:@selector(smallQianHeAnimation) withObject:nil afterDelay:3]; //延时调用取消 NSObject cancelPreviousPerformRequestsWithTarget [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(smallQianHeAnimation) object:nil];
14.两个App跳转
应用程序之间的跳转(AppOne-AppTwo) AppOne配置 第一.gotoAppTwo按钮的点击事件 //应用程序之间的跳转 (在AppTwo添加key值 info.plist—>URL types—>URL Schemes—->item0—>在后面空白处添加string—AppTwo可以随便写,但是你要记得住,一般写你的这个工程的名字)) [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"AppTwo://?name=bb&psw=789&URL=AppOne"]]; 第二.AppTwo界面配置 //1.在入口类方法AppDelegate.m中. //1.URLKey:NSURL: 要跳转的那个应用程序的URL //2.SourceApplicationKey: 跳过来的那个应用程序的名字 //2.用提示框显示出来 UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"tips" message:[NSString stringWithFormat:@"%@",launchOptions] delegate:nil cancelButtonTitle:@"知道了!" otherButtonTitles:nil, nil]; [alertView show]; //3.设置让通知延迟调用 [self performSelector:@selector(post:) withObject:launchOptions afterDelay:1]; //4.发送通知 - (void)post:(NSDictionary *)dic{ [[NSNotificationCenter defaultCenter] postNotificationName:@"getdata" object:dic]; //5.ViewController.m中接收通知 @property(nonatomic,copy)NSString * getUrl; 接收通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getData:) name:@"getdata" object:nil]; - (void)getData:(NSNotification *)noti{ //1.用字典来接收object这个对象 NSDictionary * dic = noti.object; //2.从字典中取出 要跳转的那个应用程序的URL NSURL * url = dic[UIApplicationLaunchOptionsURLKey]; //3.//将URL转化为字符串 NSString * urlStr = url.absoluteString; //4.用? 把字符串分割 NSArray * urlArr = [urlStr componentsSeparatedByString:@"?"]; //5.取出问号之后的内容 NSString * str1 = [urlArr lastObject]; //6.用&分割 NSArray * dataArr = [str1 componentsSeparatedByString:@"&"]; //7.取出firstObject name=bb NSString * nameStr = [dataArr firstObject]; //8.用=分割 NSArray * tempArr = [nameStr componentsSeparatedByString:@"="]; //9.取出Lastobject - bb _showLabel.text = [tempArr lastObject]; //10. 设置返回键 (首先在AppOne 设置key值) 并在URL后面拼接 info.plist—>URL types—>URL Schemes—->item0—>在后面空白处添加string—AppOne NSString * dataUrl = [dataArr lastObject]; self.getUrl = [[dataUrl componentsSeparatedByString:@"="] lastObject]; //11.显示在弹出框里面 UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:urlStr delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alertView show];//让弹出框显示出来 // 让字符串显示在label上 } //返回按钮的点击事件 //设置成通用的按钮,在后面的URL里面拼接URL=&AppOne - (IBAction)backButtonClick:(UIButton *)sender { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@://",self.getUrl]]]; }
15.tag作用
一、for循环中 tag值 的作用
tag:标签。UI控件的一个属性,可以用来区分控件,找控件
①tag值相当于给控件添加一个编号,用来区分控件 多个按钮绑定同一个点击事件 用来区分点击的是哪个按钮
②(找控件)
点击同一个按钮呈现不同的点击事件
区分控件
二、找控件
①多个按钮绑定同一个点击事件 如何区分点击的是哪个按钮(找不同)
②点击同一个按钮,呈现不同的点击事件
③找控件 View
16.基本类型转换
//布尔类型转字符串 BOOL change; [NSString stringWithFormat:@"%d",change]; //字符串 转化成 基本类型 // 字符串 转化成 基本类型 int userAnswer = [textField.text intValue]; // 将基本类型转化成字符串类型-->字符串拼接 NSString *name = [NSString stringWithFormat:@"%d.jpg",count%4]; backImageView.image = [UIImage imageNamed:name]; //1.把 字符串 转化成 基本类型 int userAnswer = [textField.text intValue]; //2.把 字符串 转化成 浮点型 float userAnswer = [textField.text floatValue]; //3.把 整型 转化成 字符型 NSString *userAnswer = [NSString stringWithFormat:@“%d.jpg”,i]; //4.把 浮点型 转化成 字符型 NSString *userAnswer = [NSString stringWithFormat:@“%f.jpg”,i]; //5.字符串转化为具体的类 if(sender.tag>arr. count)return; NSString * className = arr[sender.tag]; 将取出来的类的名字,根据名字转化成具体的类 Class class = NSClassFromString(className); //6.将Data数据转化为字符串(NSUTF8StringEncoding) NSString * str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
17.NSMutableAttributedString 设置居中
//需要点击的字符不同 NSString *label_text2 = @"和彩印用户服务协议与隐私政策"; NSMutableAttributedString *attributedString2 = [[NSMutableAttributedString alloc]initWithString:label_text2]; [attributedString2 addAttribute:NSFontAttributeName value:kBoldFont(26*gScale) range:NSMakeRange(0, label_text2.length)]; [attributedString2 addAttribute:NSForegroundColorAttributeName value:XBHexString(@"#459bff") range:NSMakeRange(0, 9)]; [attributedString2 addAttribute:NSForegroundColorAttributeName value:ALLOCCOLOR(0xff9B9B9B) range:NSMakeRange(9, 1)]; [attributedString2 addAttribute:NSForegroundColorAttributeName value:XBHexString(@"#459bff") range:NSMakeRange(10, 4)]; NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.alignment = NSTextAlignmentCenter;// 设置文字居中 [attributedString2 addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [label_text2 length])]; protocolLbl.numberOfLines = 2; protocolLbl.attributedText = attributedString2; [protocolLbl tapActionWithBlcokStrings:@[@"和彩印用户服务协议",@"隐私政策"] tapClicked:^(NSString *string, NSRange range, NSInteger index) { // NSString *message = [NSString stringWithFormat:@"点击了“%@”字符\nrange: %@\nindex: %ld",string,NSStringFromRange(range),index]; // [HKMessageBox showMessage:message]; if ([string isEqualToString:@"和彩印用户服务协议"]) { XBProtocolViewController * vc = [[XBProtocolViewController alloc] init]; [self.navigationController pushViewController:vc animated:YES]; }else if ([string isEqualToString:@"隐私政策"]) { XBPrivacyViewController * vc = [[XBPrivacyViewController alloc] init]; [self.navigationController pushViewController:vc animated:YES]; } }];
Xcode隐藏ToolBar之后怎么让它再次显示出来:双击工程--showToolBar
18.枚举简单定义:
typedef enum { /** 全部 */ HKTopicTypeAll = 1, /** 图片 */ HKTopicTypePicture = 10, /** 段子 */ HKTopicTypeWord = 29, /** 声音 */ HKTopicTypeVoice = 31, /** 视频 */ HKTopicTypeVideo = 41 } HKTopicType; typedef NS_ENUM(NSUInteger, HKTopicType) { /** 全部 */ HKTopicTypeAll = 1, /** 图片 */ HKTopicTypePicture = 10, /** 段子 */ HKTopicTypeWord = 29, /** 声音 */ HKTopicTypeVoice = 31, /** 视频 */ HKTopicTypeVideo = 41 };
19.修改网页字体大小和背景颜色
//document.getElementsByTagName('img'); //document.getElementById('jsParamFuncSpan').innerHTML //document.getElementsByTagName('body')[0].outerHTML //document.getElementsByClassName('标签的类名') //document.getElementsByClassName('adpic')[0].style //document.getElementsByTagName('img')[0].src //document.getElementsByTagName('img')[0].src //document.getElementsByTagName('img')[0].src='http://findicons.com/files/icons/132/software_files/512/png.png' //document.getElementsByClassName('component-container')[0].style.background='RGBA(0,0,0,1)' 直接修改网页图片 NSString * script = @"document.getElementsByTagName('img')[0].src='http://findicons.com/files/icons/132/software_files/512/png.png'"; [self.webView evaluateJavaScript:script completionHandler:nil] ; -(void)webView:(WKWebView*)webView didFinishNavigation:(WKNavigation*)navigation{ [self.loadingView dismiss]; [self.webView evaluateJavaScript:[XBSkinInstance getWebViewBgColor] completionHandler:nil] ; UIColor * color = [XBSkinInstance getCurrentNavBgColor]; if ([Ctx isLightColor:color]) { [self.webView evaluateJavaScript:[XBSkinInstance getWebViewLightTextColor] completionHandler:nil] ; }else { [self.webView evaluateJavaScript:[XBSkinInstance getWebViewDarkTextColor] completionHandler:nil] ; } } - (NSString *)getWebViewBgColor{ //[NSString stringWithFormat:@"document.body.style.background='RGBA(0,0,0,0.2)'"] NSString * webBgUserScript = [NSString stringWithFormat:@"document.body.style.background='RGBA(0,0,0,0.2)'"]; return webBgUserScript; } - (NSString *)getWebViewLightTextColor { //document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '300%' //document.getElementsByTagName('body')[0].style.webkitTextFillColor= '#9098b8' //@"document.getElementsByTagName('body')[0].style.webkitTextFillColor= 'RGB(255,255,255)'"; NSString * webLightTextScript = @"document.getElementsByTagName('body')[0].style.webkitTextFillColor= 'RGB(0,0,0)'";//黑色 return webLightTextScript; } - (NSString *)getWebViewDarkTextColor { NSString * webDarkTextScript = @"document.getElementsByTagName('body')[0].style.webkitTextFillColor= 'RGB(255,255,255)'";//白色 return webDarkTextScript; }
20.ARC/MRC交换管理权
ARC只能管理foundation框架的变量,如果程序中把foundation框架中的变量强制转换Core_Foundation框架的变量,需要交换管理权
非ARC-ARC:插入-fobjc-arc
ARC- 非ARC:插入-fno-objc-arc
21.远程推送的原理就是:
//1.手机或者说苹果自动将用户的UDID和应用的AplD发送到APNs,APNs返回一个 device Token给ioS设备,同一个手机不同的应用会生成不同的 device loken,同一个手机同一个应用只生成一个 device oken; //2手机端将 device Token发送到自己公司的后台服务器,用以保存; //3当后台需要推送消息给用户时,服务器将需要推送的消息和 device oken传输给APNs; //4“APNs将消息推送给指定的 device Token对应的手机5用户接收消息;
22.给一个空指针发送消息会发生什么?
函数不会执行无意义的操作,直接返回。
23.设置视图View旋转90°显示
XBBookCompletePromptView * completeView = [[XBBookCompletePromptViewalloc] initWithFrame:CGRectMake(0, 0, SCREEN_HEIGHT, SCREEN_WIDTH) withDelegate:self]; completeView.center = CGPointMake(SCREEN_WIDTH/2, SCREEN_HEIGHT/2); [self.view addSubview:completeView]; completeView.transform = CGAffineTransformMakeRotation(M_PI/2);
24.价格处理优化 :四舍五入保留一位小数
float a = 1412.244019; NSLog(@"a is %f", a); //output a is 1412.244019 a = [[NSString stringWithFormat:@"%.2f", a] floatValue]; NSLog(@"a is %f", a); //output a is 1412.239990 //1. 您是否尝试过这个? CGFloat val = 37.777779; CGFloat rounded_down = floorf(val * 100) / 100; /* Result: 37.77 */ CGFloat nearest = floorf(val * 100 + 0.5) / 100; /* Result: 37.78 */ CGFloat rounded_up = ceilf(val * 100) / 100; /* Result: 37.78 */ NSLog(@"rounded_down:%.1f\nnearest:%.1f\nrounded_up:%.1f",rounded_down,nearest,rounded_up);
25.获取tableviewCell在当前屏幕中的坐标值
CGRect rectInTableView = [tableView rectForRowAtIndexPath:indexPath]; CGRect rect = [tableView convertRect:rectInTableView toView:[tableView superview]]; NSLog(@"==rectInTableView:=%@",NSStringFromCGRect(rect));
26.获取当前页面是push 还是present过来的
NSArray *viewcontrollers=self.navigationController.viewControllers; if (viewcontrollers.count>1) { if ([viewcontrollers objectAtIndex:viewcontrollers.count-1]==self) { //push方式 [self.navigationController popViewControllerAnimated:YES]; } }else{ //present方式 [self.navigationController dismissViewControllerAnimated:YES completion:nil]; }
28.Xcode工程清理:
干净的工程 (三清)
1- 清理所有缓存数据 (Xcode—偏好设置——DerivedData文件下全部清空—最后Product—Clean)
2- (window——Projects)
3- 工程中蓝色工程文件—右键—shows in Finder —右键显示包内容 ——(齿轮文件不可删除)
29.返回带Tabbar的首页
//返回首页 -(void)goHome { for (UIViewController *controller in self.navigationController.viewControllers) { if ([controller isKindOfClass:[HKHomeViewController class]]) { [self.navigationController popToViewController:controller animated:YES]; } } 方法:2: self.navigationController.tabBarController.hidesBottomBarWhenPushed=NO; //0表示返回到tabor第一个按钮的主页面,依此类推 self.navigationController.tabBarController.selectedIndex=0; }
30.第一次进入,让键盘弹出
视图将要出现时<ViewWillAppear> [selfperformSelector:@selector(showKeyboard) withObject:nilafterDelay:0]; viewDidLoad之后 - (void)showKeyboard { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [_inputTopic becomeFirstResponder]; }); }
31.导航条字体样式设置
// 1.设置左右两个Baritem 的字体颜色 self.navigationController.navigationBar.tintColor = [UIColor redColor]; // 2.设置标题字体大小和文本颜色 [self.navigationController.navigationBar setTitleTextAttributes: @{NSFontAttributeName:[UIFont systemFontOfSize:19], NSForegroundColorAttributeName:[UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1]}]; // 3.设置导航条的背景颜色 self.navigationController.navigationBar.barTintColor = [UIColor blueColor];
32.按钮无法点击原因:
第一,可能你的按钮根本就没有实例化对象,
第二,实例化对象了,但是没有加载到View上,
第三,加载到View上了,但是Frame不对,超出试图了
第四,Frame也存在,但是隐藏了按钮
在imageView上面添加button 不能点击原因
①imageView父视图的交互性未打开打开
②UIButton一定要在父视图之内
超出父视图之外 不能点击
33.XIB屏幕适配常用:
屏幕适配【AutoLayOut—SizeClasses 】 Leading ->左边约束 Trailing->右边约束 Top->顶部约束 Bottom->底部约束 Center Horizontally In container 水平居中【trailing】 Center Vertically In container 中心垂直 Equal Widths Equal Heights 方向比例约束:Aspect Ratio Constaint Constant:间距,间隔 Priority:优先级 Multiplier:宽高比例
34.将所有警告设置为报错:
Build Settings->error->Treat Warnings as Errors :YES
35.主线程卡死(案例)
①setData时不要使用延迟加载
-(void)setDataArray:(NSArray *)dataArray{ //SetData时不要使用延迟加载 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ _dataArray = dataArray.mutableCopy; [jingxuanDataSource setDataArray:dataArray.mutableCopy]; [self reloadData]; }); }
36.SDCycleScrollView图片显示加载不全
设置imageView的contentMode
//解决办法 - (void)setupImageView { UIImageView *imageView = [[UIImageView alloc] init]; _imageView = imageView; _imageView.backgroundColor = ColorWithRGB(242, 242, 242); _imageView.contentMode = UIViewContentModeScaleToFill; [self addSubview:imageView]; }
37.TextField过滤特殊字符
//过滤其他字符-/()%^&$ -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ if (textField == _userNickNameTextField||textField==_babyNickNameTextField) { NSUInteger lengthOfString = string.length; //lengthOfString的值始终为1 for (NSInteger loopIndex = 0; loopIndex < lengthOfString; loopIndex++) { unichar character = [string characterAtIndex:loopIndex]; //将输入的值转化为ASCII值(即内部索引值),可以参考ASCII表 // 48-57;{0,9};65-90;{A..Z};97-122:{a..z} if (character < 48) return NO; // 48 unichar for 0 if (character > 57 && character < 65) return NO; // if (character > 90 && character < 97) return NO; if (character > 122) return NO; } // Check for total length NSUInteger proposedNewLength = textField.text.length - range.length + string.length; if (proposedNewLength > kMAXPASSWORDLIMIT) { return NO;//限制长度 } return YES; } return YES; } -(void)textFiledDidEditingChanged:(NSNotification *)obj{ for (UITextField *textField in tempArray) { NSString *toBeString = textField.text; //获取高亮部分 UITextRange *selectedRange = [textField markedTextRange]; UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0]; // 没有高亮选择的字,则对已输入的文字进行字数统计和限制 if (!position) { //手机号显示 if (textField.tag == USERNICKNAME_TEXTFIELD_TAG) { if (toBeString.length > kMAXUSERNICKNAMECOUNTLIMIT) { NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, kMAXUSERNICKNAMECOUNTLIMIT)]; textField.text = [toBeString substringWithRange:rangeRange]; } }else if (textField.tag == BABYNICKNAME_TEXTFIELD_TAG) { if (toBeString.length > kMAXBABYNICKNAMECOUNTLIMIT) { NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, kMAXBABYNICKNAMECOUNTLIMIT)]; textField.text = [toBeString substringWithRange:rangeRange]; } } } } }
38.进制转换
进制转换 //十进制--->二进制 /* 对于整数部分,用被除数反复除以2,除第一次外,每次除以2均取前一次商的整数部分作被除数并依次记下每次的余数。另外,所得到的商的最后一位余数是所求二进制数的最高位。 对于小数部分,采用连续乘以基数2,并依次取出的整数部分,直至结果的小数部分为0为止。故该法称“乘基取整法”。 */ 十进制,比如:6,如果将它转换成二进制数是110.从下往上读 被除数 计算过程 商 余数 6 6/2 3 0 3 3/2 1 1 1 1/2 0 1 //二进制--->十进制 二进制数100 换算成十进制 用横式计算为: 0*2^0+0*2^1+1*2^2 = 4 //十进制--->八进制 /* 10进制数转换成8进制的方法,和转换为2进制的方法类似,唯一变化:除数由2变成8。 */ 将十进制数120转换成八进制数。 用表格表示: 被除数 计算过程 商 余数 120 120/8 15 0 15 15/8 1 7 1 1/8 0 1 120转换为8进制,结果为:170。 //八进制--->十进制 八进制就是逢8进1,采用0-7这8个数来表达一个数。八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方…… 将八进制数1507转换成十进制数: 7*8^0+0*8^1+5*8^2+1*8*3 = 839 //十进制--->十六进制 10进制数转换成16进制的方法,和转换为2进制的方法类似,唯一变化:除数由2变成16。 将10进制数120转换成16进制数: 被除数 计算过程 商 余数 120 120/16 7 8 7 7/16 0 7 120转换为16进制,结果为:78。 //十六进制--->十进制 16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用 A,B,C,D,E,F这六个字母来分别表示10,11,12,13,14,15。字母不区分大小写。 十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方…… 一个十六进数 2AF5, 那么如何换算成10进制呢? 用竖式计算: 2AF5换算成10进制: 第0位: 5 * 160 = 5 第1位: F * 161 = 240 第2位: A * 162 = 2560 第3位: 2 * 163 = 8192 ------------------------------------- 10997 直接计算就是: 5 * 160 + F * 161 + A * 162 + 2 * 163 = 10997 (别忘了,在上面的计算中,A表示10,而F表示15)
39.APP用户无操作一段时间后执行其他操作
//XBTimeOutApplication.h中 #import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> //定义应用程序超时时间,单位为分钟,因此我们会在这个数上乘以60,以便折算成秒数。 #define kApplicationTimeoutInMinutes 3 //定义通知名称,其真实内容是字符串 "timed out" #define kApplicationDidTimeoutNotification @"AppTimeOut" @interface XBTimeOutApplication : UIApplication{ NSTimer *myidleTimer; } -(void)resetIdleTimer; @end //XBTimeOutApplication.m中 #import "XBTimeOutApplication.h" @implementation XBTimeOutApplication // 监听所有触摸,当屏幕被触摸,时钟将被重置 -(void)sendEvent:(UIEvent *)event { [super sendEvent:event]; if (!myidleTimer) { [self resetIdleTimer]; } NSSet *allTouches = [event allTouches]; if ([allTouches count] > 0) { UITouchPhase phase= ((UITouch *) [allTouches anyObject]).phase; if (phase ==UITouchPhaseBegan) { [self resetIdleTimer]; } } } //重置时钟 -(void)resetIdleTimer { if (myidleTimer) { [myidleTimer invalidate]; } //将超时时间由分钟转换成秒数 int timeout = kApplicationTimeoutInMinutes; myidleTimer = [NSTimer scheduledTimerWithTimeInterval:timeout target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO]; } //当达到超时时间,张贴 kApplicationTimeoutInMinutes通知 -(void)idleTimerExceeded { [[NSNotificationCenter defaultCenter] postNotificationName: kApplicationDidTimeoutNotification object:nil]; UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:@"用户无操作" delegate:@"OK" cancelButtonTitle:@"Cancel" otherButtonTitles:nil, nil]; [alertView show]; } @end //使用: - (void)addAppTimeOutNotification { [XBNotiCenter addObserver:self selector:@selector(videoPlayerNoActionEvent) name:kApplicationDidTimeoutNotification object:nil]; } - (void)videoPlayerNoActionEvent { [self.smallScreenView.playerView enterFullScreen]; }
40.正则匹配URL
正则表达式规则: - @"."表示匹配任意字符 - @"+"表示匹配的数量,至少是一个 - (.+)表示通配,至少一个字符 - @"(.*)"表示匹配的数量可以任意,也可以没有 // 编写正则表达式:只能是数字或英文,或两者都存在 NSString * requestStr = @"http://localhost:3333/#/article?_k=1f9qae"; NSString * regex = @"(.+)/#/(.*)\\?_k=(.+)"; // 创建谓词对象并设定条件的表达式 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; // 对字符串进行判断 if ([predicate evaluateWithObject:requestStr]) { NSLog(@"Match"); }
41.手势事件与TableViewCell点击事件冲突
//解决: -(BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldReceiveTouch:(UITouch*)touch { if([NSStringFromClass([touch.view class])isEqual:@"UITableViewCellContentView"]){ return NO; } return YES; } //UITapGestureRecognizer和UIButton的点击事件冲突的解决办法 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[UIButton class]]) { return NO; } return YES; }
42.字符串截取
//截取字符串有如下方法 [string substringToIndex:7];//截取掉下标7之后的字符串 [string substringFromIndex:2];//截取掉下标2之前的字符串 [string substringWithRange:range];//截取范围类的字符串 //如何直接截取某串字符串的后8位 [string substringFromIndex:string.length- 8 ]; 截取一个字符串中,两个指定字符串中间的字符串, // 要截取 "> 和 </ 之间的汉字内容: NSString *string = @"<a href=\"http\">这是要截取的内容</a>"; NSRange startRange = [string rangeOfString:@"\">"]; NSRange endRange = [string rangeOfString:@"</"]; NSRange range = NSMakeRange(startRange.location + startRange.length, endRange.location - startRange.location - startRange.length); NSString *result = [string substringWithRange:range]; NSLog(@"%@",result);
43.多个按钮设置只能点击其中一个按钮
@property (nonatomic,strong) UIButton *selectedBtn; //记录选中的按钮 -(void)titleBtnClick:(UIButton *)btn { if (btn!= self.selectedBtn) { self.selectedBtn.selected = NO; btn.selected = YES; self.selectedBtn = btn; }else{ self.selectedBtn.selected = YES; } } - (void)buttonClick:(UIButton*)sender { if (sender!=self.selectedBtn) { _ascendingBtn.selected = NO; _descendingBtn.selected = NO; self.selectedBtn.selected = NO; sender.selected = YES; self.selectedBtn = sender; }else if (sender==self.priceBtn){ sender.selected = !sender.selected; }else { self.selectedBtn.selected = YES; } }
44.利用Xcode查看设备的UUID
点击Xcode->Window->Devices->选择自己的设备
45.UILabel添加Tap手势
UILabel添加Tap手势时要把交互性userInteractionEnable属性打开,否则就无法点击
46.UIScrollView设置子subView可伸缩
self.scrollView.minimumZoomScale = 0.5;//最小缩放比例 self.scrollView.maximumZoomScale = 2.0;//最大缩放比例 //缩放 -(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { return self.imageView;//告诉scrollView哪个view可以缩放 }
48.Storyboard设置导航控制器
选择VC->Editor->Embed in ->Navigation ViewController
49.绝对值设置
iOS 绝对值 // 处理int类型的取绝对值 int abs(int i); //处理double类型的取绝对值 double fabs(double i); //处理float类型的取绝对值 float fabsf(float i);
50.iOS强制转换
//格式:(要强转的类名*)系统的cell UICollectionViewCell *targetCell = [collectionView cellForItemAtIndexPath:indexPath]; [(XBMineOpusCell*)targetCell checkBtn].hidden = YES;
51.延迟执行和取消延迟执行
延迟执行
[self performSelector:@selector(scrollDone) withObject:nil afterDelay:0.5];
取消延迟执行
在0.5秒内取消执行函数,带的参数必须一样,才能取消 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(scrollDone) object:nil];
52.判断文件的后缀名
//判断图片的后缀名 //[topic.image1.pathExtension.lowercaseString isEqualToString:@"gif"]
53.对象转换成字典
//将对象转成字典 NSDictionary *dict = @{@"name" : @"why", @"age" : @18, @"height" : @1.88}; Person *p = [[Person alloc] init]; [p setValuesForKeysWithDictionary:dict]; NSDictionary *dict1 = [p dictionaryWithValuesForKeys:@[@"name", @"age", @"height"]]; NSLog(@"%@", dict1);
54.ARC和MRC混编交换管理权
非ARC-ARC:插入-fobjc-arc
ARC-非ARC:插入-fno-objc-arc