iOS笔记 (13)
UIViewController的一些事儿
序
这篇主要是想写 Contaner View Controller。然后才好写我计划里面的下一篇讲UIStoryboardSegue的blog。
先贴一个链接 Container View Controller.他写的很好,算是中文blog里面我见过写 Container View Controller最好的一篇blog。
另外一篇中文blogUIViewController的误用
然后是apple的官方文档
UIViewController Class Reference
View Controller Programming Guide for iOS
什么是UIViewController
UIViewController就是MVC模型在iOS当中对应Controller的具体类型。最基础普通的情况下,每一个屏就要对应一个UIViewController的子类。也就是说你向storyboard拖入一个view controller的时候。你还必须新建一个接管你这个storyboard的UIViewController子类。然后把他们两个连接起来。这样就可以获得了一个MVC里面的VC了。然后这个UIViewController其实是管理着一组View Hierarchy。因为你的屏幕上可能有各种控件。每一个控件都是一个View。他们构成了一组View Hierarchy。
so这个UIViewController的子类控制着这组View的行为。包括View的显示,消失,改变,动画等等。
这种说明有点抽象了,来点简单的。UIViewController就是View的主子。一个ViewController应该且只应该管理一个view hierarchy,而通常来说一个完整的view hierarchy指的是整整占满的一个屏幕。
之前有一篇讲过了一点View Controller生命周期的blogiOS笔记(5)。可以看看。
什么是Contaner View Controller
通常情况下,我们的App不会只有一个View Controller这么简单。会有很多个View conroller。我们不能让我们的App里面的View Controller杂乱无章。我们需要一个东西来能够管理这些View Controller。这个东西就叫Contaner View Controller。Contaner View Controller也是继承于UIViewController。这里我们可以得到两个信息:
- UIViewController其实可以自己管理自己。我们就可能自己写Contaner View Controller。
- 加上上图的描述。Contaner View Conroller(Navigation Controller)其实是一直存在的。
常见的Contaner View Controller
其实常见的Contaner View Controller也就两个UINavigationController和UITabbarController。他们肯定都有一些特征:(摘抄第一篇blog)
- 提供对Child View Controller进行管理的接口,比如添加Child View Controller,切换Child View Controller的显示,移除Child View Controller 等
- 容器“拥有”所有的Child View Controller
- 容器需要负责 Child View Controller的appearance callback的调用(viewWillAppear,viewDidAppear,viewWillDisaapper,viewDidDisappear),以及旋转事件的传递
- 保证view hierarchy 和 view controller hierarchy 层级关系一致,通过parent view controller将child view controller和容器进行关联
其实如果我们进行一般的iPhone App快速开发。这两个Contaner View Controller已经足够用了。
UINavigationController
简单的UINavigationController如系统的Setting。
很简单。就是一个满屏一个满屏的推进,然后回退。学过程序的你看到那些描述也很亲切。可以简单理解为数据结构中的栈的图形方式。Push为进栈,Pop出栈。你还可以Pop全部已经压入的数据。
当然UINavigationController肯定要比一个栈复杂的多。下图是UINavigationController的层次结构
肯定的,我们在相应的场景里面可以选择把Navigation bar或者 Naviagtion toolbar设置为显示或者不显示。这完全取决于你的设计。
UITabbarController
和UINavigationController不同,UITabbarController使用的场景更可能是不太相关连的View Controller组合到一起。而UINaviagtionController强调的是层层递进的关系。
所以,UITabbarController管理下的View Controller所做的操作是切换,而不是Push。
UITabbarController的层次结构
后记
当然UINavigationController和UITabbarController是可以放到一起使用的。UINavigationController代表的纵向的View Controller推进方向。UITabbarController代表着横向的View Controller切换方向。
喜欢这些碎碎叨对你有用。欢迎批评指正错误。thx。