ios 开发小知识点
1.不可变数组转变为可变数组声明实例变量的数组 必须记得实现
对于遍历数组找到对象后 如果还需要查找 记得先结束 再查找(return/break)
NSArray * arr = @[@"人在囧途",@"煎饼侠",@"西游记",];
NSMutableArray * arr = [NSMutableArrayarrayWithArray:arr];
在数组中取数据的时候 需要通过后缀 将数组中的对象转化为数字类
p11.age=
[newArr[1]intValue];
2.获取字符串长度NSString * str = nameLabel .text;
CGSizesize=
[strsizeWithAttributes:@{NSFontAttributeName: [UIFontsystemFontOfSize:17]}];
此时即可得到size
.width(字符串的宽 即 字符串长度)
3.将单独的某个视图上的视图控制器的导航条隐藏
[objc]view plaincopy
-(void)viewDidAppear:(BOOL)animated{
[superviewDidAppear:animated ==NO];
[self.navigationControllersetNavigationBarHidden:YES];
}
4. 边帽法 (拉伸图片) 将某一像素点儿不断地复制 其他像素点不变 拉伸之后不会是图片变形
[objc]view plaincopy
//第一种
[[UIImageViewalloc]init].image= [[UIImageimageNamed:@"bubble.png"]stretchableImageWithLeftCapWidth:20topCapHeight:20];
//第二种
UIImage* image =[UIImageimageNamed:@"7.jpg"];
[imageresizableImageWithCapInsets:UIEdgeInsetsMake(0, image.size.width,0,0)];
[[UIImageViewalloc]init].image= image;
5. 监听系统发送的通知
[objc]view plaincopy
// 监听键盘frame发生变化的通知 并可以通过键盘的属性获得对象
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(KeyboardWillChangeFrame:)name:UIKeyboardWillChangeFrameNotificationobject:nil];
- (void)KeyboardWillChangeFrame:(NSNotification*)noti {
// UIKeyboardAnimationCurveUserInfoKey = 7;
// UIKeyboardAnimationDurationUserInfoKey = "0.25";
// UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 216}}";
// UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 588}";
// UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 372}";
// UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 480}, {320, 216}}";
// UIKeyboardFrameChangedByUserInteraction = 0;
// UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 264}, {320, 216}}";
//一旦键盘发生改变的时候 _inputView 和 _tableView 的坐标都要发生改变
//通过字典 获取对象
NSDictionary* dic = noti.userInfo;
//获取动画时长
floattime = [[dicobjectForKey:UIKeyboardAnimationDurationUserInfoKey]floatValue];
//获取动画速率
intcurve = [[dicobjectForKey:UIKeyboardAnimationCurveUserInfoKey]intValue];
//获取键盘坐标
CGRect rect = [[dicobjectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue];
}
6.通过字符串绘制矩形 MAXFLOAT 无限
[objc]view plaincopy
NSString* str = _chatArr[indexPath.row];
CGRect rect = [strboundingRectWithSize:CGSizeMake(200, MAXFLOAT)options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeadingattributes:@{NSFontAttributeName: [UIFontsystemFontOfSize:15]}context:nil];
7.视图层级切换
关键点:
[self .window exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
1.如果父视图不可交互 那么放在其上边的子视图也不可交互
2. 如果父视图可以交互 那么放在上边的子视图的可交互性由自己决定
关键词 :userInteractionEnabledimage .userInteractionEnabled=YES;
8.二进制数据转变类型
字符串转变为二进制数据
NSString * str = @"girls";
NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
二进制数据转变为字符串
NSString * str2 =[[NSString alloc]initWithData:data1 encoding:NSUTF8StringEncoding];
将图片转变为二进制数据
1.需要获得图片路径
NSString * imageViewPath =[[NSBundle mainBundle]pathForResource:@"18" ofType:@"jpg"];
NSData * data = [[NSData alloc]initWithContentsOfFile:imageViewPath];
2.直接将添加在工程中的图片转化为二进制数据类型
UIImage*
image = [UIImageimageNamed:@"20.jpg"];
NSData*
data =UIImageJPEGRepresentation(image,1);
将转变为二进制数据的图片转变回图片
方法1 可以直接调用 从路径中取出图片
UIImage * image = [UIImage imageWithContentsOfFile:dataPath];
方法2 : 先将路径中的二进制数据取出 然后 通过ImageWithData 属性转变为图片类型
NSData * data = [NSData dataWithContentsOfFile:[self getFilePath:@"data.plist"]];
UIImage * image =[UIImage imageWithData:data];
9.如何删除一个视图上的所有子视图 所有代码:
获取视图上存放的所有子视图 遍历数组 找到所有对象 找到 views
[objc]view plaincopy
for(UIView* v inself.view.subviews) {
[vremoveFromSuperview];
}
10.将某个视图放在最前边
[self .view bringSubviewToFront:_tableView];
11.页面跳转(需要找window)
//找window
方法1:
[objc]view plaincopy
UIWindow* window =[[[UIApplicationsharedApplication]delegate]window];
window.rootViewController= aViewController;
方法2:
[objc]view plaincopy
UIApplication* app = [UIApplicationsharedApplication];
AppDelegate* delegate = app.delegate;
UIWindow* window = delegate.window;
window.rootViewController= aViewController;
1.页面翻转
[objc]view plaincopy
[UIViewbeginAnimations:nilcontext:nil];
[UIViewsetAnimationDuration:1];
[UIViewsetAnimationTransition:UIViewAnimationTransitionCurlUpforView:windowcache:YES];
[UIViewcommitAnimations];
2. 模态弹出 (present 展示 dismiss 消失 )
3. 导航控制器 (push 压栈 pop 出栈 )
//通过导航控制器控制视图切换的时候
1. 返回上一界面:
[self.navigationControllerpopViewControllerAnimated:YES];
2. 返回根视图控制器:
[self.navigationControllerpopToRootViewControllerAnimated:YES];
3.返回指定视图:
//首先获取目前所有的视图控制器对象
NSArray*
arr =self.navigationController.viewControllers;
//从数组中找到需要返回的根视图
FirestViewController*
first = arr[0];
//返回指定视图:
[self.navigationControllerpopToViewController:firstanimated:YES];
12.将数据库文件拷贝到沙盒中
[objc]view plaincopy
//首先需要获取数据库文件的路径 还有文件夹路径
NSString* sourePath = [[NSBundlemainBundle]pathForResource:@"database"ofType:@"sqlite"];
if(![[NSFileManagerdefaultManager]fileExistsAtPath:@"文件路径"]) {
NSError* error =nil;
if( [[NSFileManagerdefaultManager]copyItemAtPath:sourePathtoPath:@"文件路径"error:&error]) {
NSLog(@"copy成功");
}
}
13:直接进入网页
[objc]view plaincopy
//网页加载 :
// 创建url NSURL: NSObject 用来表示资源在互联网的位置
NSURL * url = [NSURLURLWithString:@"http://www.baidu.com"];
//创建一个请求
NSURLRequest*request = [NSURLRequestrequestWithURL:url];
//加载请求
[webViewloadRequest:request];
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"http//www.baidu.com"]];
14:将结构体转换成字符串再输出
NSLog(@"-------%@",NSStringFromCGRect(rect));
15:角度转弧度
可以定义为宏#define
ANGLE_2_HUDU(X) (X)*M_PI/180.0
计算圆形轨迹上控件的中心点坐标时
中心点 圆的半径 角度转弧度 角度值
floatx
= 160 + 100 *cos(ANGLE_2_HUDU(btn.angle));
floaty
= 240 + 100 *sin(ANGLE_2_HUDU(btn
.angle));
//x = 中心点x + 半径 * cos@
//y = 中心点y + 半径 *sin@
16:交叉导入
//为了防止交叉导入
@class 文件
//只是告诉了编译器有这个类 但是该类的.h文件中有什么东西 编译器是不知道的 当真正需要使用这个类的时候 还必须在.m 文件中导入#import
"TwoViewController.h”这个头文件
17: center + bounds = frame ;
//center(设置中心点)
+ bounds(设置宽.高) = frame
image .center = CGPointMake(160, 120);
//bounds (x,y ,width ,height ), 给bounds设置x和y是没有作用的
image .bounds = CGRectMake(0, 0, 160, 120);
18:查询父视图
NSLog(@"==%@",image.superview);
查看view的子视图
NSLog(@"==%@",self .window .subviews);
19.重新添加xib文件
如果创建的xib 文件的名字不同 需要在入口方法中调用一下方法
ViewController * vc = [[ViewController alloc]initWithNibName:@"Empty" bundle:nil];
20.屏幕获取触摸对象
[objc]view plaincopy
-(void)touchesMoved:(NSSet*)toucheswithEvent:(UIEvent*)event {
//获取触摸对象
UITouch* touch =[touchesanyObject];
//获取触摸对象 在某一视图上的一个点
CGPoint point = [touchlocationInView:self.view];
//把结构体转换为字符串输出
NSLog(@"---%@",NSStringFromCGPoint(point));
//CGRectContainsPoint 作用 : 判断CGRect 数据是否包含一个点 point 如果包含这个点 函数值就是1
//类似属性 CGRectIntersectsRect(CGRect rect1, CGRect rect2) 判断两个坐标是否有交集
//NO1. 触摸对象坐标 NO2.结构体
if(CGRectContainsPoint(self.view.frame, point)) {
self.view.center= point;
}
}
21:判断对象之间联系常用的属性
1.判断某个对象坐标时候包含某个点
CGRectContainsPoint(self.frame.frame, point)
2. 判断两个坐标是否有交集
CGRectIntersectsRect(rect1, rect2)
3.判断两个对象时候相等的时候
isEqualToString:
4. 判断字符串类型数据长度的时候 需要调用length
22.获取系统当前时间
[objc]view plaincopy
NSDate* date = [NSDatedate];
//时间格式 年yyyy 月 MM 日dd 小时 HH 分钟 mm 秒 ss
NSDateFormatter* formatter = [[NSDateFormatteralloc]init];
[formattersetDateFormat:@"yy-MM-dd HH-mm-ss"];
NSString*str = [formatterstringFromDate:date];
NSLog(@"-=-=-=-=-=-=-===%@",str);
23. 分割(返回值类型 - 数组) . 拼接字符串
//分割:
NSArray * arr =[str componentsSeparatedByString:@" "];
//字符串之间用什么隔开 分割时 在@“” 中就调用什么 (eg: | 空格 等);
//拼接:
[NSString stringWithString:@""]
[NSString stringWithFormat:@""]
去掉字符串中间的空格
return [self stringByReplacingOccurrencesOfString:@" " withString:@""];
去掉字符串的换行符
str =[str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
24 .定时器 .延迟加载
//定时器开启的时候 为防止点击按钮时开启多个定时器造成混乱 所以在开启定时器的时候可以先判断时候有开启定时器
方法1:
[objc]view plaincopy
staticBOOLisOk;
if(isOk ==NO) {
NSTimer* timer = [NSTimerscheduledTimerWithTimeInterval:0.1target:selfselector:@selector(onTimer)userInfo:nilrepeats:YES];
//开启定时器后 如果想要定时器立即开启 可以调用
[timerfire];
isOk =YES;
}
方法2 :
[objc]view plaincopy
if(_timer) {
return;
}
_timer = [NSTimerscheduledTimerWithTimeInterval:0.1target:selfselector:@selector(onTimer)userInfo:nilrepeats:YES];
//关闭定时器时 记得立即将其指为空
[_timerinvalidate];
_timer =nil;
延时加载
[objc]view plaincopy
//定时器绑定方法的时候 只能讲自身传过来
_timer = [NSTimerscheduledTimerWithTimeInterval:0.05target:selfselector:@selector(onTimer:)userInfo: buttonrepeats:YES];
-(void)onTimer: (NSTimer*)aTimer{
//通过userInfo 获取点击的按钮
UIButton* clickBtn = aTimer.userInfo;
}
//延迟加载 要点 需要调用performSelector
[selfperformSelector:@selector()withObject:nilafterDelay:5];
25 .文本框结束编辑的时候 让键盘下去
[objc]view plaincopy
-(void)touchesBegan:(NSSet*)toucheswithEvent:(UIEvent*)event{
[self.windowendEditing:YES];
}
26:向相册中保存图片
[objc]view plaincopy
UIImageWriteToSavedPhotosAlbum([UIImageimageNamed:@"20.jpg"],self,@selector(image:didFinishSavingWithError:contextInfo:),NULL);
//必要实现的协议方法, 不然会崩溃
- (void)image:(UIImage*)imagedidFinishSavingWithError:(NSError*)errorcontextInfo:(voidvoid*)contextInfo {
}
27.输出当前所在的方法名:
NSLog(@"-----%s---", __func__);
28.三目运算符
条件 ?(执行操作) : 其它操作
number = i <= 8 ?(i + 1) : 0 解释 : 当i 小于等于8 时 执行 i+1 的操作 否则 执行冒号后面的操作 即 i = 0;
29.在数组中随机取出数据
1) 首先先在数组中随机出一个索引
int random = arc4random()%numberArray .count;
2) 将取出的数据转化为想要的类型
int number = [numberArray [random] intvalue];
3) 将取出的数据在数组中删除 以防止随机重复
[numberArray removeObjectAtIndex : random];
30.视图修剪 .透明度 隐藏视图 移除视图 :
clip 修剪 bounds 边界
1.是否对视图修剪
bigView .clipsToBounds=YES;
2.设置圆角半径
bigView .layer.cornerRadius=
90;
bigView.layer.masksToBounds=YES;
3.透明度:
_view .alpha = 0;
4.移除视图 :
[_view removeFromSuperview];
31: 字符串拼接输出控件属性值
NSLog(@"
= %@",NSStringFromCGRect(nav.navigationBar.frame));
32:第一响应:
1.打开程序时 文本框处于编辑状态 即 第一响应
成为第一响应 [_textfieldbecomeFirstResponder];
失去第一响应[_textfield resignFirstResponder];
2.在tocubegin协议方法中调用
[self.view endEditing: YES]
33 .导航控制器相关控件内容
1.设置导航条的背景颜色
错误做法:nav
.navigationBar.backgroundColor=
[UIColorgrayColor];
正确做法:nav
.navigationBar.barTintColor=
[UIColorgrayColor];
2.设置导航条标题self.title=@"导航条";
3. 设置左右栏按钮项 (记得按钮绑定方法的实现)
[objc]view plaincopy
UIBarButtonItem* lifeItem = [[UIBarButtonItemalloc]initWithTitle:@"保存"style:UIBarButtonItemStylePlaintarget:selfaction:(@selector(baoCunBtnClick:))];
self.navigationItem.leftBarButtonItem= lifeItem;
UIBarButtonItem* rightItem = [[UIBarButtonItemalloc]initWithTitle:@"添加分组"style:UIBarButtonItemStylePlaintarget:selfaction:(@selector(addGrounpBtnClick:))];
self.navigationItem.rightBarButtonItem= rightItem;
4.隐藏导航条 :
//注意: 隐藏导航条的时候 不能混着用 怎么让导航条隐藏的 就怎么让导航条出现 :
方法1:
[self.navigationControllersetNavigationBarHidden:YES];
[self.navigationControllersetNavigationBarHidden:YESanimated:YES];
方法2:self.navigationController.navigationBarHidden=YES;
self.navigationController.navigationBarHidden=NO;
补充 : 在视图将要显示的时候 隐藏导航条 :
[objc]view plaincopy
-(void)viewWillAppear:(BOOL)animated {
[superviewWillAppear:animated];
[self.navigationControllersetNavigationBarHidden:YES];
}
5.设置导航条按钮项时候添加图片 (图片渲染)
[objc]view plaincopy
UIImage* image = [[UIImageimageNamed:@"back"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UIBarButtonItem* backBar = [[UIBarButtonItemalloc]initWithImage:imagestyle:UIBarButtonItemStylePlaintarget:selfaction:@selector(backClick)];
self.navigationItem.leftBarButtonItem= backBar;
self.navigationController.view.contentMode= UIViewContentModeScaleAspectFit;//设置内容样式,通过保持长宽比缩放内容适应视图的大小,任何剩余的区域的视图的界限是透明的
///按钮设置背景图片时 设置背景图片大小 防止图片变形
UIImage* btnImg = [UIImageimageNamed:@"button_table"];
UIImage* bbImg = [btnImgstretchableImageWithLeftCapWidth:100topCapHeight:100];
6. 隐藏导航条自定义的返回按钮 :
self.navigationItem.hidesBackButton=YES;
7.导航条上添加控件
self.navigationItem.titleView = 控件对象;
34.弹框
iOS8以后推荐使用UIAlertController
样式1: UIAlertView
[objc]view plaincopy
UIAlertView*alertView =[[UIAlertViewalloc]initWithTitle:@"提示"message:@"新建联系人"delegate:selfcancelButtonTitle:@"取消"otherButtonTitles:@"确定",nilnil];
//弹框样式 :(带输入框)
alertView.alertViewStyle=UIAlertViewStyleLoginAndPasswordInput;
UITextField*field1=[alertViewtextFieldAtIndex:0];
UITextField*field2=[alertViewtextFieldAtIndex:1];
field1.placeholder=@"请输入姓名";
field2.placeholder=@"请输入电话";
field2.secureTextEntry=NO;
[alertViewshow];
//实现 alertView 首先在.h文件中 实现协议
实现协议方法:
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;
//通过buttonIndex 的索引值 判断点击的是哪个按钮 0 ,1
样式2:ActionSheet
//ActionSheet
不可以在viewDidLoad 方法中创建 这是因为 ActionSheet 是在self .view 上展示的
此时我们的viewDidLoad 方法还没有走完 我们的self.view 就不能展示出来 self.view 还没有展示
那么我们放在self.view上的actionsheet 也就无法展示
UIActionSheet*
actionSheet = [[UIActionSheetalloc]initWithTitle:@"提示"delegate:selfcancelButtonTitle:@"取消"destructiveButtonTitle:@"确定"otherButtonTitles:nil,nil];
[actionSheetshowInView:self.view];
7.设置cell的背景颜色
[objc]view plaincopy
-(void)tableView:(UITableView*)tableViewwillDisplayCell:(UITableViewCell*)cellforRowAtIndexPath:(NSIndexPath*)indexPath {
[cellsetBackgroundColor:[UIColorblackColor]];
}
35.
九宫格
[objc]view plaincopy
//方法1: 嵌套for 循环
for(inta =0; a <2; a ++) {
for(intb =0; b <3; b++) {
UIButton* btn = [UIButtonbuttonWithType:UIButtonTypeSystem];
btn.backgroundColor= [UIColorredColor];
btn.frame= CGRectMake(30+ (320-70)*a,80+ (60+40) * b,40,40);
[self.viewaddSubview:btn];
}
}
//方法2 .单个for循环
// 三行三列
for(inta =0; a <9; a ++) {
floatjiange = (320-440*3)/4;
intx = a%3;
inty = a/3;
UIButton* btn = [UIButtonbuttonWithType:UIButtonTypeSystem];
btn.backgroundColor= [UIColorredColor];
btn.frame=CGRectMake(jiange + (40+ jiange) *x, jiange + (40+ jiange) * y,40,40);
}
36.直接在输出中判断布尔类型
n.sex?@"男鸟":@"女鸟"
37.服务器
- 去掉out.println --句中的ln换行符
str =[str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
38.如果URL中路径的字符串拼接的时候
有中文 需要编码
NSString*encodingString
= [pathstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
39.获取沙盒文件中某个文件夹下的所有内容
contentsOfDirectoryAtPath
[objc]view plaincopy
NSString*filePath =[NSHomeDirectory()stringByAppendingPathComponent:@"Documents"];
//返回值类型是数组
NSArray*arr = [[NSFileManagerdefaultManager]contentsOfDirectoryAtPath:filePatherror:nil];
NSLog(@"arr===%@",arr);
40 .获取沙盒文件中某个文件的属性
[objc]view plaincopy
NSString*filePath =[NSHomeDirectory()stringByAppendingPathComponent:@"Documents/str.plist"];
//返回值类型是字典 所以我们可以通过字典内的键值 取出我们想要的数据
NSDictionary*dic = [[NSFileManagerdefaultManager]attributesOfItemAtPath:filePatherror:nil];
unsignedlonglongsize= [dicfileSize];
NSLog(@"----%llu",size);
NSLog(@"dic====%@",dic);
41:输出对象的时候设置输出字符串格式调用的方法
[objc]view plaincopy
//输出对象的时候 会调用该对象的description 方法
-(NSString*)description{
return[NSStringstringWithFormat:@"IP-----%p name----%@ age-----%d",self,self.name,self.age];
}
42:沙盒文件中路径查找的便捷方式
1.获取根目录文件路径
NSLog(@"-----%@",NSHomeDirectory());
2.获取临时文件路径方法类似于获取根目录文件路径
NSString*
temp =NSTemporaryDirectory();
3.获取资源包路径
NSString*appPath = [[NSBundlemainBundle]bundlePath];
4.获取某图片或文件夹路径
NSString * imageViewPath =[[NSBundle mainBundle]pathForResource:@"18" ofType:@"jpg"];
5.获取某目录下的文件—>文件路径
NSDictionary * dic =[[NSFileManager defaultManager]attributesOfItemAtPath:[self getPath] error:nil];
43:对象序列化
归档步骤 :
1. 创建可变的data (相当于一个空的袋子 )NSMutableData*
data= [[NSMutableDataalloc]initWithCapacity:0];
2.归档 关键词 : archiver
NSKeyedArchiver*
archiver = [[NSKeyedArchiveralloc]initForWritingWithMutableData:data];
3.编码 : (就是将对象类转变为二进制数据的过程)
[archiver encodeObject:_arr];
//如果有多个对象的时候 通过 设置 key值来区分
[archiverencodeObject:_arrforKey:@"arr"];
[archiverencodeObject:_viewforKey:@"view"];
4.结束编码的时候 必须调用 接收方法 (完成编码)
[archiverfinishEncoding];
5.可以将转变为二进制数据类型的 对象类写入沙盒中
[datawriteToFile:
[selfgetFilePath]atomically:YES];
反序列化 (将二进制数据类型 转换为对象类)
1. 在沙盒中取出data数据
NSData*
data = [[NSDataalloc]initWithContentsOfFile:[selfgetFilePath]];
2.将取出的数据交给反序列化来读
NSKeyedUnarchiver*
unarchiver = [[NSKeyedUnarchiveralloc]initForReadingWithData:data];
3.解码
NSArray * arr = [unarchiver decodeObject];
//如果有多个对象 (如上)
NSArray*
arr = [unarchiverdecodeObjectForKey:@"arr"];
4.结束解码 :
[unarchiverfinishDecoding];
补充 : 为了调取路径方法方便 可以将获取路径封装成方法 便于调用
[objc]view plaincopy
-(NSString*)getFilePath{
return[NSHomeDirectory()stringByAppendingPathComponent:@"Documents/arr.plist"];
}
2.自定义对象转码的时候
1. 需要在.h文件中必须实现的协议
2.在.m 文件中必须实现的两个方法
//将people类中的属性进行编码
//aCoder 编码器
//当用序列化器编码对象的时候 , 该方法就会被调用
[objc]view plaincopy
-(void)encodeWithCoder:(NSCoder*)aCoder{
NSLog(@"3333333333");
[aCoderencodeObject:_nameforKey:@"name"];
[aCoderencodeInt:_ageforKey:@"age"];
}
//解码
//aDecoder 解码器
//反序列化时 将NSData 解码成对象类型调用的方法
[objc]view plaincopy
-(id)initWithCoder:(NSCoder*)aDecoder {
//任意类型 初始化[super init] 方法
self= [superinit];
if(self) {
//需要self.属性 接收
self.name= [aDecoderdecodeObjectForKey:@"name"];
self.age= [aDecoderdecodeIntForKey:@"age"];
}
returnself;
}
补充 : 如果再创建一个类 继承与自定义people类时
实现第二个协议方法时 (返回值为id 的协议方法 ) 需要先继承父类方法 即:
[objc]view plaincopy
-(id)initWithCoder:(NSCoder*)aDecoder {
self= [superinitWithCoder:aDecoder];
if(self) {
[aDecoderdecodeObjectForKey:@"huzi"];
}
returnself;
}
快速转码 :
1.直接将对象放在沙盒中
[NSKeyedArchiverarchiveRootObject:_arrtoFile:[selfgetFilePath]];
2. 在反序列化中直接取出对象
NSArray*
arr = [NSKeyedUnarchiverunarchiveObjectWithFile:[selfgetFilePath]];
44:NSUserDefaults储存数据
(储存轻量级的数据(账号 密码 是否登录))
//1.NSUserDefaults 可以存储的数据类型 : NSString 字典 数组 NSNumber BOOL NSData(二进制数据) NSDate(时间) int(integer) Double float, URL(网址)
//2.强制数据及时存储到沙盒
//userDefaults向沙盒中储存数据是按照一定的时间戳定时储存数据如果数据还没来得及存储而此时程序出现问题那么数据就会丢失所以我们可以同步一下强制数据及时存储到沙盒
//synchronize同步保证数据及时的储存到沙盒中
[userDefaults synchronize];
45: NSUserDefaults存取文件
[objc]view plaincopy
//存数据:
[[NSUserDefaultsstandardUserDefaults]setObject:_nameField.textforKey:@"name"];
[[NSUserDefaultsstandardUserDefaults]setObject:_pswField.textforKey:@"psw"];
//同步数据
[[NSUserDefaultsstandardUserDefaults]synchronize];
//取数据:
NSString* nameString = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"name"];
NSString* pswString =[[NSUserDefaultsstandardUserDefaults]objectForKey:@"psw"];
46:判断某路径下是否存在文件
是不是文件夹 关键词 :fileExistsAtPath
[objc]view plaincopy
NSString*filePath1=[NSHomeDirectory()stringByAppendingPathComponent:@"Documents/str.plist"];
NSString*filePath2=[NSHomeDirectory()stringByAppendingPathComponent:@"Documents/ABC"];
BOOLisDirectory ;
BOOLisExist= [[NSFileManagerdefaultManager]fileExistsAtPath:filePath2isDirectory:&isDirectory];
if(isExist==YES) {
NSLog(@"存在文件");
if(isDirectory==YES) {
NSLog(@"是个文件夹");
}else{
NSLog(@"不是文件夹");
}
}else{
NSLog(@"不存在文件");
}
47 .网络请求中网络超时设置request .timeoutInterval = 10;
48.单元格关键控件摘要
1.分割线颜色样式:
tableVew .separatorColor=[UIColorredColor];
tableVew .separatorStyle=UITableViewCellSeparatorStyleNone;
2.单元格背景View
可以设置图片 下拉的时候显示
tableVew .backgroundView=imageView;
3.单元格表头背景View可以设置图片因为需要设置坐标可以通过封装方法然后在ViewDidLoad
方法中调用
tableVew.tableHeaderView=imageView;
4.视图修剪
cell.imageView.layer.cornerRadius=50;
cell.imageView.layer.masksToBounds=YES;
5.cell小挂件
cell .accessoryType=UITableViewCellAccessoryDetailButton;
6.点击单元格时候的样式:
cell .selectionStyle=UITableViewCellSelectionStyleNone;
7.如果想把单元格的白色背景去掉的话
需要将tableView 和cell 上的背景颜色都设置为clearColor
8.点击单元格上的按钮时候在按钮绑定的方法中找到点击的是哪一行上的按钮需要通过按钮找到cell 再通过cell 找到IndexPath
eg:UITableViewCell*
cell =(UITableViewCell*)btn.superview.superview;NSIndexPath*
indexPath =[_tableViewindexPathForCell:cell];
9.区头区尾相关内容
//也需要重用区头和区尾的设置中 相关的控件设置和添加需要放在cell.contentView
e.g:
1.cell.contentView.backgroundColor=
[UIColorgrayColor];
2.[cell.contentViewaddSubview:img];
10.单元格索引:
将索引标示放在数组中
self.arr=
@[@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z",@"#",];索引调用的方法:
[objc]view plaincopy
-(NSArray*)sectionIndexTitlesForTableView:(UITableView*)tableView {
return_arr;
}
49. btn按钮的失去响应
btn .enabled = NO;
//默认值 YES
btn.enabled = YES;
50.在为URL添加字符串时
包含特殊字符或中文的 需要编码转换
string =[string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
51.图片转化为二进制数据
//两种方法都可以 但是 PNG的返回的图片量与原图大小差不多 而jpg 的会压缩参数NSData * data = UIImagePNGRepresentation(self.imageView.image);
NSData * data = UIImageJPEGRepresentation(self.imageView.image, 0.1);
52.断点下载个别属性摘要
1. 获取已经下载文件的大小 文件较大的时候 可以用long long 创建实例变量
_receiveSize =[dic fileSize];
2.通过Range
头 —> 可以指定每次从网上下载数据包的大小
[request addValue:[NSString stringWithFormat:@"bytes=%lld-",_receiveSize] forHTTPHeaderField:@"Range"];
3.期望从服务器中返回的剩余的数据expectedContentLength
long long lastSize = response.expectedContentLength;
4.受到响应的时候
需要创建对象 并给对象一个写文件的路径
_fileHandle = [NSFileHandle fileHandleForWritingAtPath:[self getPath]];
//找到已经下载文件的结尾数据[_fileHandle seekToEndOfFile];
//写入数据
[_fileHandle writeData:data];
//开始在接受数据的协议方法中不断的追加数据
_receiveSize +=[data length];
5.下载进度赋值到进度条
//当前下载比例=接收数据/总数据
float progress =(float) _receiveSize /_totalSize;
self.weak.progress = progress;
self .persentLabel.text = [NSString stringWithFormat:@"%.2f%%",progress*100];
6.暂停数据绑定的方法中
暂停请求数据 同时将请求数据指为空 (类似于定时器)
[_connection cancel];
_connection = nil;
53.OC中对用户名和密码编码和加密常用的方法base64 MD5
//在需要加密内容的后面添加后缀
[_nameField.textbase64EncodedString]编码
[_nameField.textbase64DecodedString]解码
[_pswField.textMD5]加密
54.在web请求体重 截取某个字段
@"https://api.weibo.com/oauth2/authorize?client_id=1950801855&response_type=code&redirect_uri=http://www.baidu.com"该请求体中的code
NSRangerange
=[request.URL.absoluteStringrangeOfString:@"code="];
NSString*
code =[[request.URL.absoluteStringcomponentsSeparatedByString:@"="]lastObject];
都是单纯地字符串操作
55.判断授权token
和 过期时间的两种方式 :
[objc]view plaincopy
//方式1:
NSString* token =[[NSUserDefaultsstandardUserDefaults]objectForKey:@"token"];
NSDate* time =[[NSUserDefaultsstandardUserDefaults]objectForKey:@"time"];
if(token ==nil|| [tokenisEqualToString:@""]) {
returnNO;
}
if([[NSDatedate]compare:time] != NSOrderedAscending) {
returnNO;
}
returnYES;
//方式2:
NSString* token = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"token"];
//过期时间
NSDate* date = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"date"];
if(token ==nil|| [tokenisEqualToString:@""]) {
returnNO;
}
//当前时间
NSDate* currentDate =[NSDatedate];
//当前时间和过期时间 对比
if([[currentDatelaterDate:date]isEqualToDate:currentDate]) {
returnNO;
}
returnYES;
56.如果需要设置多个tag值时
//一般设置tag值只需要设置为数字进行区分的话 就可以 但是如果接口较多 需要区分的话 单独的设置为数字 时间久的话 不好辨认 所以我们可以模仿系统 来写出一个枚举来
// NSInteger指的是枚举中值的类型RequestType总的请求类型
typedefNS_ENUM(NSInteger, RequestType) {
GetTokenRequestTag = 0,
GetStatusListRequestTag
//需要再往下写的时候 不需要设置数字就可以 因为系统会自动递增
};
调用时:view.tag =GetTokenRequestTag;
57.向上取整
[objc]view plaincopy
//首先可以先获取矩形高度 然后向上取整
CGRect rect =[stringboundingRectWithSize:CGSizeMake(310, MAXFLOAT)options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeadingattributes:@{NSFontAttributeName: [UIFontsystemFontOfSize:17]}context:nil];
//向上取整
returnceilf(rect.size.height);
58.查找某个具体文件(eg:图片)路径的方法
[objc]view plaincopy
NSString* directoryPath =[NSHomeDirectory()stringByAppendingPathComponent:@"Documents/ImageCache"];
//保证沙盒中的Documents 中一定有一个ImageCache 文件夹
if(![[NSFileManagerdefaultManager]fileExistsAtPath:directoryPath]) {
[[NSFileManagerdefaultManager]createDirectoryAtPath:directoryPathwithIntermediateDirectories:YESattributes:nilerror:nil];
}
//把图片的地址字符串分割 最后一个/ 之后的那段就是图片的名字
NSString* fileName =[[@"URLString"componentsSeparatedByString:@"/"]lastObject];
NSString* filePath =[NSStringstringWithFormat:@"%@/%@", directoryPath,fileName];
returnfilePath;
59.在导航条上添加UI控件
self.navigationItem.titleView=
segment;
60.视图留白
self.automaticallyAdjustsScrollViewInsets=NO;
61.iOS汉字转为拼音
//城市列表通讯录右边索引字母或者拼音如何的到
[objc]view plaincopy
NSMutableString* hanzi =[[NSMutableStringalloc]initWithString:@"中华人民共和国 重庆 长城 单家庄"];
CFMutableStringRef hanziRef =(__bridge CFMutableStringRef)hanzi;
//CFStringTransform 字符串转化
//kCFStringTransformMandarinLatin 汉字转拼音
//kCFStringTransformStripDiacritics 拼音去音标
CFStringTransform(hanziRef,0, kCFStringTransformMandarinLatin,NO);
NSLog(@"---%@",hanziRef);
CFStringTransform(hanziRef,0, kCFStringTransformStripDiacritics,NO);
NSLog(@"111---%@",hanziRef);
62.设备宽高宏定义
#define DEVICE_WIDTH [UIScreen mainScreen].bounds.size.width
#define DEVICE_HEIGHT [UIScreen mainScreen].bounds.size.height
63:
给button 按钮设置背景图片时 设置背景图片大小 防止图片变形
[objc]view plaincopy
UIImage*btnImg =[UIImageimageNamed:[NSStringstringWithFormat:@"button_table_%d",i]];
UIImage* bbImg =[btnImgstretchableImageWithLeftCapWidth:100topCapHeight:100];
[btnsetBackgroundImage:bbImgforState:UIControlStateNormal];
64:
异常崩溃处理
在AppDelegate .m 文件中
[objc]view plaincopy
- (BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
//输出模拟器类型
NSLog(@"%@",[[UIDevicecurrentDevice]model]);
//绑定扑捉异常的函数 当程序崩溃时 会先调用这个函数
NSSetUncaughtExceptionHandler(&getException);
returnYES;
}
voidgetException(NSException*exception){
//遇到特殊情况时 需要把异常的具体信息获取并储存
NSLog(@"名字----%@",exception.name);
NSLog(@"原因----%@",exception.reason);
NSLog(@"用户信息----%@",exception.userInfo);
NSLog(@"栈内存地址----%@",exception.callStackReturnAddresses);
NSLog(@"栈描述----%@",exception.callStackSymbols);
NSString*string = [NSStringstringWithFormat:@"名字%@,原因%@,信息%@,栈内存地址%@,栈描述%@",exception.name,exception.reason,exception.userInfo,exception.callStackReturnAddresses,exception.callStackSymbols];
NSLog(@"%@",string);
NSDate*date = [NSDatedate];
//当前的系统版本号
NSString* version =[[UIDevicecurrentDevice]systemVersion];
//当前设备型号
[[UIDevicecurrentDevice]model];
//储存崩溃信息
NSString* path =[NSHomeDirectory()stringByAppendingPathComponent:@"Library/exception.txt"];
[stringwriteToFile:pathatomically:YESencoding:NSUTF8StringEncodingerror:nil];
//当程序再次启动时 把崩溃信息发送给服务器
}
65:去除掉首尾的空白字符和换行字符
[objc]view plaincopy
NSString* headerData = [headerDatastringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]];//去除掉首尾的空白字符和换行字符
headerData = [headerDatastringByReplacingOccurrencesOfString:@"/r"withString:@""];
headerData = [headerDatastringByReplacingOccurrencesOfString:@"/n"withString:@""];
66:为视图view自定义矩形大小
[objc]view plaincopy
self.edgesForExtendedLayout= UIRectEdgeNone;
CGRect viewBounds =self.view.bounds;
floatnavBarHeight =self.navigationController.navigationBar.frame.size.height+20;
viewBounds.size.height= ([[UIScreenmainScreen]bounds].size.height) - navBarHeight;
self.view.bounds= viewBounds;