导航控制器
1.导航控制器永远显示的是栈顶控制器的view
2.导航控制器中做界面之间的跳转必须拿到导航控制器
3.调用pop方法并不会马上销毁当前控制器
4.popToViewController使用注意点,传入进去的控制器必须是导航控制器栈里面的控制器
5.导航条的内容由栈顶控制器决定,一个导航控制器只有一个导航条,因此只能由一个控制器决定,谁先显示在最外面,谁就是栈顶控制器.
6.在iOS7之后,默认会把导航条上的按钮的图片渲染成蓝色.
7.导航条上的子控件位置不需要我们管理,只需要管理尺寸
8.UINavigationItem:是一个模型,决定导航条的内容(左边内容,中间,右边内容)
- UIBarButtonItem:是一个模型,决定导航条上按钮的内容
10.以后只要看到item,通常都是苹果提供的模型,只要改模型就能修改苹果的某些控件.
1-控制器view的生命周期
- 控制器的view的生命周期方法都是以view开头
- viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear -> viewWillDisappear -> viewDidDisappear
3.在非ARC中viewDidUnload,经常用来清空界面上的数据
2-数据存储
1.plist存储
1.plist存储,生成一个plist文件.
2.plist不是数组就是字典,plist存储就是用来存储字典或者数组.
注意:Plist不能存储自定义对象
3.获取应用沙盒中Caches文件路径
// directory:获取哪个文件夹
// domainMask:在哪个范围内搜索,NSUserDomainMask:表示在用户的手机上查找
// expandTilde:是否展开全路径 YES:表示展开全路径 NO:不会展开全路径,会把应用沙盒的路径用波浪号(~)代替
// 获取到Caches文件夹路径
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
4.读取plist,之前是什么类型存储的,读取也是什么
2.偏好设置存储
// 偏好设置存储:NSUserDefaults
// 以字典的形式进行偏好设置,用法跟字典.
// 偏好设置好处: 1.不需要关心文件名
// 2.快速进行键值对存储
// 3.直接存储基本数据类型
@implementation ViewController
- (IBAction)save:(id)sender {
// 获取单例
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// @"123" key:pwd
[defaults setObject:@"123" forKey:@"pwd"];
// bool
[defaults setBool:YES forKey:@"isOn"];
// int
[defaults setInteger:10 forKey:@"num"];
}
- (IBAction)read:(id)sender {
// 利用NSUserDefaults单例
NSString *pwd = [[NSUserDefaults standardUserDefaults] objectForKey:@"pwd"];
NSInteger i = [[NSUserDefaults standardUserDefaults] integerForKey:@"num"];
NSLog(@"%@--%ld",pwd,i);
}
3.归档
1.NSKeyedArchiver专门用来做自定义对象归档
// 什么时候调用:当一个对象要归档的时候就会调用这个方法归档
// 作用:告诉苹果当前对象中哪些属性需要归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeInt:_age forKey:@"age"];
}
// 什么时候调用:当一个对象要解档的时候就会调用这个方法解档
// 作用:告诉苹果当前对象中哪些属性需要解档
// initWithCoder什么时候调用:只要解析一个文件的时候就会调用
- (id)initWithCoder:(NSCoder *)aDecoder
{
#warning [super initWithCoder]
if (self = [super init]) {
// 解档
// 注意一定要记得给成员属性赋值
_name = [aDecoder decodeObjectForKey:@"name"];
_age = [aDecoder decodeIntForKey:@"age"];
}
return self;
}