美文网首页IOS开发路上的故事iOS菜鸟食谱知识点
UIViewController中各方法调用顺序及功能详解

UIViewController中各方法调用顺序及功能详解

作者: GoGooGooo | 来源:发表于2016-02-22 13:14 被阅读4562次

    UIViewController中
    loadView (当访问UIViewController的view属性时)
    viewDidLoad (加载视图时调用)
    viewWillAppear (视图即将可见时调用)
    viewDidAppear (视图即将加入窗口时调用)
    viewWillLayoutSubviews (视图布局改变时调用,如:屏幕旋转)
    viewDidLayoutSubviews 在以下情况下会被调用:

    1、init初始化不会触发layoutSubviews
    2、addSubview会触发layoutSubviews
    3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
    4、滚动一个UIScrollView会触发layoutSubviews
    5、旋转Screen会触发父UIView上的layoutSubviews事件
    6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
    

    viewWillDisappear(视图将被从屏幕上移除之前调用)
    viewDidDisappear ( 视图已经被从屏幕上移除,用户看不到这个视图了调用)

    当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序
    1、alloc                  创建对象,分配空间
    2、init (initWithNibName) 初始化对象,初始化数据
    3、loadView               从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
    4、viewDidLoad            载入完成,可以进行自定义数据以及动态创建其他控件
    5、viewWillAppear         视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
    6、viewDidAppear          视图已在屏幕上渲染完成
    
    当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反
    1、viewWillDisappear      视图将被从屏幕上移除之前执行
    2、viewDidDisappear       视图已经被从屏幕上移除,用户看不到这个视图了
    3、dealloc                视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
    

    didReceiveMemoryWarning 收到系统传来的内存警告通知后会执行的方法
    shouldAutorotateToInterfaceOrientation 是否支持不同方向的旋转视图
    willAnimateRotationToInterfaceOrientation 在进行旋转视图前的会执行的方法(用于调整旋转视图之用)
    按照调用顺序说明如下:

    1. initWithNibName:bundle:
      初始化UIViewController,执行关键数据初始化操作,注意这里不要做view相关操作,view在loadView方法中才初始化,这时loadView还未调用。如果使用StoryBoard进行视图管理,程序不会直接初始化一个UIViewController,StoryBoard会自动初始化或在segue被触发时自动初始化,因此方法initWithNibName:bundle:不会被调用。如果在代码里面使用instantiateViewControllerWithIdentifier:方法显示初始化一个UIViewController,则initWithCoder方法会被调用。

    如果是通过调用initWithNibName:bundle指定nib文件名初始化的话,ViewController会根据此nib来创建View。如果name参数为nil,则ViewController会通过以下两个步骤找到与其关联的nib: 1)如果ViewController的类名以“Controller”结尾,例如ViewController的类名是MyViewController,则查找是否存在MyView.nib; 2)找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib

    1. loadView
      当访问UIViewController的view属性时,view如果此时是nil,那么VC会自动调用loadView方法来初始化一个UIView并赋值给view属性。此方法用在初始化关键view,需要注意的是,在view初始化之前,不能先调用view的getter方法,否则将导致死循环(除非先调用了[supper loadView];)

    如果没有重载loadView方法,则UIViewController会从nib或StoryBoard中查找默认的loadView,默认的loadView会返回一个空白的UIView对象。

    1. viewDidLoad
      当VC的view对象载入内存后调用,用于对view进行额外的初始化操作

    2. viewWillAppear
      在view即将添加到视图层级中(显示给用户)且任意显示动画切换之前调用(这个时候supperView还是nil)。这个方法中完成任何与视图显示相关的任务,例如改变视图方向、状态栏方向、视图显示样式等

    3. viewDidAppear
      在view被添加到视图层级中,显示动画切换之后调用(这时view已经添加到supperView中)。在这个方法中执行视图显示相关附件任务,如果重载了这个方法,必须在方法中调用[supper viewDidAppear];

    4. viewWillLayoutSubviews
      view即将布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化),要调整Subviews的位置,在调整之前要做的一些工作就可以在该方法中实现。

    5. viewDidLayoutSubviews
      view已经布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化),已经调整Subviews的位置,在调整完成之后要做的一些工作就可以在该方法中实现。

    6. viewWillDisappear
      view即将从superView中移除且移除动画切换之前,此时还没有调用removeFromSuperview。

    7. viewDidDisappear
      view从superView中移除,移除动画切换之后调用,此时已调用removeFromSuperview。

    相关文章

      网友评论

      本文标题:UIViewController中各方法调用顺序及功能详解

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