多控制器--UINavigationController

生命周期

  • 调用顺序
  • [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的底层实现
  1. 到StoryBoard中查找有没有指定标识的segue
  2. 根据指定标识,创建一个UIStoryBoardSegue对象之后,把当
  3. 前的控制器设置为它的源控制器
  4. UIStoryBoardSegue对象,再去创建目标控制器并且赋值
  5. 调用当前控制器的prepareForSegue:方法,告诉用户,当前的线已经准备好了
  6. [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]];

你可能感兴趣的:(多控制器--UINavigationController)