说说UIViewController 那些事儿(上)

来源:互联网 发布:linux wine怎么使用 编辑:程序博客网 时间:2024/04/29 01:29

控制器view的多种创建方式

  1. 控制器View的多种创建方式
    首先需要自定义控制器view,作为根控制器

    1. 通过没有没有同名的xib情况下alloc init创建的View
      JHViewController* vc = [[JHViewController alloc] init];

      • 结果:View的样式是空白的(透明)
    2. 通过storyb创建,箭头所指向的控制器

    UIStoryboard* sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];JHViewController* vc = [sb instantiateInitialViewController];
    • 结果:View的样式和storyboard描述的一样

      1. 通过xib方式创建View
        JHViewController* vc = [[JHViewController alloc] initWithNibName:@"Test"

        • 结果:view的样式跟xib描述一致
      2. 有同名xib情况
        // 但是创建的时候 不用使用 initwithnibname的方法
        JHViewController* vc = [[JHViewController alloc] init];

        • 结果:默认加载的是 files owner的view的连线的view
      3. 有同名去掉controller的情况
        JHViewController* vc = [[JHViewController alloc] init];

        • 结论:优先级会比同名xib高
      4. loadview
        • 卸载控制器中,用来重写控制器的view,优先级最高
        重写控制器的loadView,不会去加载storyboard.

    • loadView方法
    * loadView作用:一般用来创建自定义的view
    * loadView什么时候调用:当控制器的view没有创建的时候,就会调用loadView 去创建控制器的view.
    * loadView的默认做法:会去加载UIStoryboard描述的控制器的view

    *  如果重写了loadView方法,    § 并且没有调用默认的操作,就不会加载UIStoryboard描述的控制器。    § 就不会自动创建控制器的view,必须自己自定义控制器的view。就不会自动创建控制器的view,必须自己自定义控制器的view。    § 并且没有创建控制器的view,就不能获取控制器的view,否则会造成死循环。*  如果控制器是窗口的根控制器,可以不用设置尺寸,系统默认会设置尺寸。*  loadView使用注意:如果重写loadView里面没有创建控制器的view,就不能使 用self.view,会造成死循环。 

    • 控制器View的决定权:重写LoadView>storyboard>nibName>xib

  2. 控制器的view是延迟加载的。
    1. 只有在窗口显示的时候,才会调用loadView 方法。
    2. 用到控制器view的时候才会加载控制器的view,设置控制器view的背景颜色
    3. 通过设置控制器view的颜色,引出两个疑问。
      a. 控制器的view由loadView决定, loadView显示什么颜色,就是什么颜色。
      b. loadView只是创建控制器View,并不能决定控制器的view的颜色。
      c. 理解loadView的调用时刻:第一次调用self.view,底层会调用LoadView 方法,创建控制器的view,这时候的view是LoadView的颜色,但是 vc.view.backgroundColor,是拿到控制器的view又设置一次颜色,把 LoadView设置的颜色给覆盖了。
      d. 在viewDidLoad也设置颜色,还是vc.view.backgroundColor决定,因为vc.view就是获取控制器的view,只有控制器的view加载完成之后,才能获取 到,因此先调用viewDidLoad。
  3. 如何快速生成一个xib描述控制器的view,之前还要在xib拖视图,设置xib描述哪个控制器,很麻烦。
    1. 定义新的控制器的时候,勾选xib,会自动搞一个xib描述控制器的view.
      会自动生成一个和控制器同名的xib,并且里面设置好了。

ViewController的加载方式

1、通过代码的方式加载viewController

UIViewController *controller = [[UIViewController alloc] init];controller.view.backgroundColor = [UIColor redColor];self.window.rootViewController = controller;

2、通过stroyboard来加载viewController
这里写图片描述

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

//加载箭头指向的viewController
JHViewController *controller = [storyboard instantiateInitialViewController];
self.window.rootViewController = controller;
3、通过xib加载viewController
这里写图片描述

    CZViewController *controller = [[CZViewController alloc] initWithNibName:@"CZOneView" bundle:nil];self.window.rootViewController = controller;

4.流程图
这里写图片描述
• loadView什么时候会调用->当 self.view == nil 的时候会调用,要创建 self.view
• 优先顺序
1> 用系统的loadView方法创建控制器的视图
2> 如果指定加载某个storyboard文件做控制器的视图,就会加载storyboard里面的描述去创建view
3> 如果指定读取某个xib文件做控制器的视图,就根据指 定的xib文件去加载创建
4> 如果有xib文件名和控制器的类名前缀(也就是去掉controller)的名字一样的 xib文件 就会用这个xib文件来创建控件器的视图 例:控件器的名为 MJViewController xib文件名为 MJView.xib 如果xib文件名后有一个字不一样就不会去根据它去创建如:MJView8.xib
5> 找和控制器同名的xib文件去创建
6> 如果以上都没有就创建一个空的控件器的视图;

0 0