10-UI进阶(控制器创建和导航控制器)

UIApplication

  • 整个app中只有一个UIApplication实例,它是单例的

UIApplicationMain的底层实现

  • 根据principalClassName提供类名创建UIApplication对象
  • 创建UIApplicationDelegate对象,并且成为UIApplication对象代理,app.delegate = delegate
  • 开启一个主运行循环,处理事件,可以保持程序一直运行
  • 加载info.plist,并且判断有没有指定main.storyboard,如果指定,就去加载

loadView的作用:自定义控制器的view

  • 调用时间:第一次使用控制器的view的时候调用
  • 注意:在这个方法中如果没有自定义view,就不能获取控制器的view
  • 一旦重写了这个方法,就不要调用[super loadView]
  • 如果重写了这个方法,就不会去加载storyboard描述的控制器的view

控制器view的创建步骤

  • 只有控制器的init方法底层会调用initWithNibName:bundle:
  • 只要通过initWithNibName:bundle:初始化控制器,并且nibName为nil,就会执行以下几步。
  • 寻找有没有跟控制器类名同名但不带Controller的xib,如果有就会去加载
  • 寻找有没有跟控制器类名同名的xib,如果有就会去加载
  • 如果都没有找到,则创建空的view

控制器view的懒加载

  • 创建UIViewController控制器,控制器的view并没有创建
  • 控制器的view懒加载:第一次使用的时候才会去加载,并不是创建UIViewController控制器的时候去加载
  • 如果控制器是窗口的根控制器就可以不用设置尺寸
self.view = [[UIView alloc] initWithFrame:CGRectZero];
  • 在viewDidLoad方法(在控制器的view加载完成的时候调用)中打印控制器的尺寸是不准确的,通常在viewDidApper方法(在view完全显示的时候调用)中打印

导航控制器的简单使用

  • 程序启动完成后调用didFinishLaunchingWithOptions方法中
    // 创建窗口
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    
    // 创建导航控制器的根控制器,也属于导航控制器的子控制器
    UIViewController *vc = [[OneViewController alloc] init];
    vc.view.backgroundColor = [UIColor redColor];
    
    // 导航控制器也需要一个根控制器
    // 默认导航控制器把根控制器的view添加到导航控制器的view上
    UINavigationController *navVc = [[UINavigationController alloc] initWithRootViewController:vc];
    
    // 设置窗口的根控制器
    self.window.rootViewController = navVc;
    
    [self.window makeKeyAndVisible];
  • 跳转第二个控制器
    TwoViewController *vc = [[TwoViewController alloc] init];
    
    vc.view.backgroundColor = [UIColor yellowColor];

    // 跳转
    // 如果导航控制器调用push(进栈),就会把vc添加为导航控制器的子控制器
    [self.navigationController pushViewController:vc animated:YES];
  • 返回上一个控制器
    // pop(出栈)不是马上把控制器销毁,而是等动画完毕以后调用dealloc方法后才进行销毁
    // 回到上一个界面
    [self.navigationController popViewControllerAnimated:YES];
  • 返回到导航控制器的根控制器
    // 注意:只能返回到栈里面的控制器
    [self.navigationController popToViewController:self.navigationController.childViewControllers[0] animated:YES];

    // [self.navigationController popToRootViewControllerAnimated:YES];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容