IOS视图生命周期

时间:2021-05-31 14:43:45

视图控制器的生命周期就是一系列的方法,当事件发生时,就会被发送至UIViewController我们创建的控制器就是UIViewController的子类,它会发送这些消息。

  1. 视图控制器的生命周期起始于创建

    initWithNibName:这个方法是在controller的类在IB(Interface Builder,界面编辑器)中创建,但是通过Xcode实例化controller的时候用的。是延迟加载,这个View上的控件是 nil 的,只有到 需要显示时,才会不是 nil。

    loadNibNamed:即时加载,用该方法加载的xib对象中的各个元素都已经存在。

    awakeFromNib:当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的awakeFromNib函数来响应这个消息,执行一些必要的操作。也就是说通过nib文件创建view对象时执行awakeFromNib。

    initWithCoder :是一个类在IB中创建但在xocde中被实例化时被调用的.比如,通过IB创建一个controller的nib文件,然后在xcode中通过 initWithNibName来实例化这个controller,那么这个controller的initWithCoder会被调用.或者是一个view的nib文件,类似方法创建时调用initWithCoder。

    在init中,不要出现创建view的代码。良好的设计,在init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据。init里不要掉self.view,否则会导致viewcontroller创建view。


    LoadView

    自定义View时使用这个方法。

    每次访问UIViewController的view(比如controller.view、self.view)而且view为nil,loadView方法就会被调用。用来负责创建UIViewController的view。

    它会先去查找与UIViewController相关联的xib文件,通过加载xib文件来创建UIViewController的view。

    如果没有找到相关联的xib文件,就会创建一个空白的UIView,然后赋值给UIViewController的view属性。

    如果想通过代码来创建UIViewController的view,就要重写loadView方法,并且不需要调用[super loadView],若没有xib文件,[super loadView]默认会创建一个空白的UIView。


    ViewDidLoad

    视图控制器已被实例化,在视图被加载到内存中的时候调用该方法,这个时候视图并未出现。在该方法中通常进行的是对所控制的视图进行初始化处理不管是通过xib文件还是重写loadView创建UIViewController的view,在view创建完毕后,最终都会调用viewDidLoad方法。


    ViewWillAppear/ViewDidAppear

    UIViewController对象的视图即将 / 已经加入窗口时调用。几何相关的代码,放在viewWillAppear里面,利于代码优化。


   ViewWillDisappear/ViewDidDisappear

        UIViewController对象的视图即将 / 已经消失,被覆盖或是隐藏时调用;


   ViewWillUnload/ViewDidUnload

       这两个方法已经被弃用;需要在didReceiveMomoryWarning释放控制器视图。


   ViewWillLayoutSubviews/ViewDidLayoutSubviews

      在由frame的改变而触发输出subview之前,这个方法被调用,可以设置subview的布局。