认识UIViewController

作者: longjianjiang | 来源:发表于2016-07-09 18:24 被阅读740次

UIViewController在开发中每天都要打交道的,通常我们用它来管理页面的View,现在就系统的研究下我们常说的MVC中的C。

创建UIViewController

三种方式:

  • new
UIViewController *vc = [UIViewController new];
  • 从Storyboard中创建
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"xxx" bundle:nil];
    UIViewController *vc = [sb instantiateInitialViewController];
  • 从Xib中创建
    UIViewController *vc = [[UIViewController alloc] initWithNibName:@"xxx" bundle:nil];

创建UIViewController的View

我们知道每个控制器都有一个页面也就是常写的self.view。先看一张草图:

Snip20160709_1.png
上图描述了控制器View加载的过程,下面给出几点建议
  • 1.loadView方法用来自定义View,此时不论控制器从Storyboard中创建还是从Xib中加载View,统统失效,以loadView方法为准。
  • 2.因为默认系统会去寻找特定名称的两个Xib,所以开发中我们如果要用到控制器View的Xib,起名字和控制器同名,避免使用图例中LJOneView,因为项目中很有可能存在LJOneView,这样会产生混淆。

UIViewController生命周期方法

看图说话:


生命周期方法.png

由图可以清楚的看到控制器View的由生到死,两点注意:

  • 控制器的View是懒加载,所以只有当销毁View后才会重新创建View。
  • viewWillUnloadviewDidUnload现在已被系统弃用。

UIViewController层级关系

  • 单控制器
    根控制器决定了这个控制器的View是否可以被显示,此时只有一个控制器。
LJOneViewController *oneVC = [LJOneViewController new];
self.window.rootViewController = oneVC;
  • 多控制器
  • 显然实际肯定不止一个控制器,比如最常见的UINavigationController是一种多控制器的组合,所以它显示的内容由子控制器的View和导航栏(有时还有工具条)组成。此时导航控制器的View始终在在Window的最上层。
  • 同时通过Modal方式也可以出现这种多控制器的情况,每次modal出来的控制器要显示的内容依然是放在源控制器的View上。如果有多次modal,那么最上层控制器的View内容显示在它下层的控制器View中,指导最底层控制器。

UIViewController中View的理解及作用

  • UIView通常用来显示内容,控制器的View也不例外,我们可以从Storyboard中拖一些控件进行布局。控制器View换句话说也可以被看做一个容器,用来存放其他要显示内容的容器。
Snip20160709_2.png
图中每个控制器强引用Root View,然后Root View对通过[self.view addSubview:xxx];的进行强引用,这也就是我们通过Storyboard拖线的控件默认是weak弱引用。
  • 控制器的View也可以管理其他控制器的View,例如UISplitViewController
Snip20160709_3.png
此时UISplitViewController的View管理着两个子控制器的View,而两个子控制器的View则管理对应的Root View的子View,最终两个子控制器View上的内容仍然放在UISplitViewController的View这个容器中显示。

尾巴

Sketch画图感觉飞起来了!

相关文章

网友评论

  • 着魔的毛豆:请问 为什么我从xib中加载vc,加载出来的view的尺寸是600*600 而不是屏幕的尺寸 有什么解决办法吗?
    longjianjiang:@着魔的毛豆 试试在IB中设置size为inferred。

本文标题:认识UIViewController

本文链接:https://www.haomeiwen.com/subject/llvrjttx.html