生命周期
- 调用顺序
- [ViewController viewDidLoad] ** 一次性的操作 **
- [ViewController viewWillAppear:] ** 多次性的操作 **
- [ViewController viewWillLayoutSubviews] ** 多次调用 **
- [ViewController viewDidLayoutSubviews] ** 多次调用 **
- [ViewController viewDidAppear:] ** 多次性的操作 **
弹窗的使用
iOS8 之前的使用方法
// iOS8 之前的使用方法
UIActionSheet *action = [[UIActionSheet alloc] initWithTitle:@"确认要删除" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"确定" otherButtonTitles:nil, nil];
[action showInView:self.view];
// 代理方法
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 0) {
[self.navigationController popViewControllerAnimated:YES];
}
}
iOS8 之后的使用方法
// 创建控制器
UIAlertController *alter = [UIAlertController alertControllerWithTitle:@"确认删除" message:@"确定要删除所选内容" preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"点击了取消");
}];
UIAlertAction *delect = [UIAlertAction actionWithTitle:@"删除" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"点击了删除");
}];
// 添加动作
[alter addAction:cancel];
[alter addAction:delect];
// 弹窗
[self presentViewController:alter animated:YES completion:nil];
手动跳转到下一个控制器
[self performSegueWithIdentifier:@"nextVC" sender:nil];
// segue跳转之前调用
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// 目标控制器,之后可以进行传值操作
segue.destinationViewController;
// 源控制器
segue.sourceViewController;
// 然后在目标控制器内的属性set方法给属性赋值
}
- performSegueWithIdentifier的底层实现
- 到StoryBoard中查找有没有指定标识的segue
- 根据指定标识,创建一个UIStoryBoardSegue对象之后,把当
- 前的控制器设置为它的源控制器
- UIStoryBoardSegue对象,再去创建目标控制器并且赋值
- 调用当前控制器的prepareForSegue:方法,告诉用户,当前的线已经准备好了
- [segue perform]
[segue.sourceViewController.navigationController pushViewController:segue.destinationViewController animated:YES];
iOS数据存储的常用方式
- XML属性列表(plist) 归档,在plist文件中不能保存自定义的对象
- Preference(偏好设置)
- NSKeyedArchiver归档(NSCoding)
// 归档操作
[NSKeyedArchiver archiveRootObject:person toFile:filePath];
// 在保存对象时告诉保存当前哪些属性
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
}
// 解档操作
[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
// 告诉当前要解析哪些属性
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
if (self == [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
- SQLite3
- Core Data
沙盒
- 路径NSHomeDirectory()
- Document--保存程序需要持久化的数据,会同步到备份中
- tem--临时数据,系统可能会删除该目录下的内容,不会同步
- Library/Caches--保存程序需要持久化的数据(一般比较大),系统不会备份该文件夹下的数据内容
- Library/Preference--程序的偏好设置(系统的settings),系统会备份
// 存储方法
// NSUserDefaults也是一个plist文件
// 不需要考虑文件存储路径(Library/Preference)和文件名称
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
/**
- (void)setObject:(nullable id)value forKey:(NSString *)defaultName;
- (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
- (void)setFloat:(float)value forKey:(NSString *)defaultName;
- (void)setDouble:(double)value forKey:(NSString *)defaultName;
- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
- (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);
*/
[defaults setInteger:10 forKey:@"age"];
// 立即写入到文档中
[defaults synchronize];
// 读取方法
[defaults integerForKey:@"age"];
- 获取沙盒路径
/**
第一个参数:搜索的目录 NSDocumentDirectory/NSLibraryDirectory/NSTemporaryDirectory()
第二个参数:搜索的范围
第三个参数:是否展开路径(ios中不识别~符号)
return: 一个包含路径的数组,iOS中一般只有一个,取下标为0的值就行
*/
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- 拼接路径 [path stringByAppendingPathComponent:@""];
导航控制器
- 导航条
// 凡是在导航条下面的scrollView,系统会默认添加偏移量
// 取消自动设置偏移量
self.automaticallyAdjustsScrollViewInsets = NO;
// 导航条或者是导航条上的控件设置透明度都是无效的
self.navigationController.navigationBar.alpha = 0;
// 设置导航条背景(必须要使用UIBarMetricsDefault模式)
// 当背景图片设置为nil,系统会自动生成一张半透明的图片,设置为导航条的背景
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
// 取消导航条阴影
[self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];