iOS的SDK中提供不少原生ViewController,大大提升了咱们的开发效率,下面是个人一些经验。 xcode
1、结构
按结构能够对iOS的全部ViewController分红两类:
一、主要用于展现内容的ViewController,这种ViewController主要用于为用户展现内容,并与用户交互,如UITableViewController,UIViewController。
二、用于控制和显示其余ViewController的ViewController。这种ViewController通常都是一个ViewController的容器。如UINavigationController,UITabbarController。它们都有一个属性:viewControllers。其中UINavigationController表示一种Stack式结构,push一个ViewController或pop一次,所以后一个ViewController通常会依赖前一个ViewController。而UITabbarController表示一个Array结构,各个ViewController是并列的。
第一种ViewController会常常被继承,用来显示不一样的数据给用户。而第二种不多被继承,除非你真的须要自定义它。
注:细心的同窗应该能发现,在Xcode中新建一个ViewController时,只能够选择继承自UIViewController和UITableViewController,而它们都是第一种。 app
2、Controller和View的生命周期
这里指的View是指Controller的View。它做为Controler的属性,生命周期在Controller的生命周期内。就是说你的Controller不能在view释放前就释放了。 post
图2 ViewController生命周期 动画
当你alloc并init了一个ViewController时,这个ViewController应该是尚未建立view的。ViewController的view是使用了lazyInit方式建立,就是说你调用的view属性的getter:[self view]。在getter里会先判断view是否建立,若是没有建立,那么会调用loadView来建立view。loadView完成时会继续调用viewDidLoad。loadView和viewDidLoad的一个区别就是:loadView时尚未view。而viewDidLoad时view以及建立好了。
当view被添加其余view中以前时,会调用viewWillAppear,而以后会调用viewDidAppear。
当view从其余view中移出以前时,会调用viewWillDisAppear,而以后会调用viewDidDisappear。
当view不在使用,并且是disappeared,受到内存警告时,那么viewController会将view释放并将其指向nil。 spa
3、代码组织(如何设计良好的viewcontroller)
ViewController生命周期中有那么多函数,一个重要问题就是什么代码该写在什么地方。
一、init里不要出现建立view的代码。良好的设计,在init里应该只有相关数据的初始化,并且这些数据都是比较关键的数据。init里不要调用self.view,不然会致使viewcontroller建立view。(由于view是lazyinit的)。
二、loadView中只初始化view,通常用于建立比较关键的view如tableViewController的tabView,UINavigationController的navgationBar,不可调用view的getter(在调super loadView前),最好也不要初始化一些非关键的view。若是你是从nib文件中建立的viewController在这里必定要首先调用super的loadView方法,但建议不要重载这个方法。
三、viewDidLoad 这时候view已经有了,最适合建立一些附加的view和控件了。有一点须要注意的是,viewDidLoad会调用屡次(viewcontroller可能屡次载入view,参见图2)。
四、viewWillAppear 这个通常在view被添加到superview以前,切换动画以前调用。在这里能够进行一些显示前的处理。好比键盘弹出,一些特殊的过程动画(好比状态条和navigationbar颜色)。
五、viewDidAppear 通常用于显示后,在切换动画后,若是有须要的操做,能够在这里加入相关代码。
六、viewDidUnload 这时候viewController的view已是nil了。因为这通常发生在内存警告时,因此在这里你应该将那些不在显示的view释放了。好比你在viewcontroller的view上加了一个label,并且这个label是viewcontroller的属性,那么你要把这个属性设置成nil,以避免占用没必要要的内存,而这个label在viewDidLoad时会从新建立。 设计