认识UIViewController

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画图感觉飞起来了!

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

推荐阅读更多精彩内容

  • 1.自定义控件 a.继承某个控件 b.重写initWithFrame方法可以设置一些它的属性 c.在layouts...
    圍繞的城阅读 3,544评论 2 4
  • 父类是UIResponder(父类是NSObject) 概念:凡是继承自UIViewController的对象,都...
    翻这个墙阅读 607评论 0 0
  • /* UIViewController is a generic controller base class th...
    DanDanC阅读 1,911评论 0 2
  • 前言的前言 唐巧前辈在微信公众号「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各项指标...
    VincentHK阅读 5,470评论 3 44
  • 文/沂得山 明天就要去上大学,今天才和在家里的母亲理好要带去的东西。东西很多,虽然在学校那边也可以买,但还是带了许...
    沂得山阅读 871评论 13 8