zoukankan      html  css  js  c++  java
  • iOS ViewController生命周期

    ViewController是view的controller,viewController的职责主要包括管理内部各个view的加载显示与卸载,同时负责与其他ViewController的通信和协调。

    在IOS中 有两类ViewController:

    1. 显示内容,比如UIViewController,UITableViewController等,同时还可以自定义继承自UIViewController得ViewController。

    2. 用于控制和显示其他ViewController的ViewController。这种ViewController一般都是一个ViewController容器:如UINavigationViewController和UITabBarController等,

    它们都有一个属性:viewControllers。UINavigationController是以Stack的形式来存储和管理ViewController,UITabBarController是以Array的形式来管理ViewController。

    ViewController生命周期

    alloc -> initWithNibName ->loadView ->viewDidLoad -> 

    viewWillAppear ->viewDidAppear -> viewWillDisappear ->

    viewDidDisappear ->dealloc。

    启动程序:  ViewDidLoad    [view即将显示,此时superview一般为nil,即view还没有加到任何一个view之中]

           ViewWillAppear    [view已经显示,被加到另一个view中]

           View Did Appear  [view即将消失,此时一半还没有调用removeFromSuperView]

    按下Home键,并没有任何纪录(此时程序被挂起)

    双击Home键,删除该程序:  ViewWillDisappear  [view从superview中移除了]

                   View Did Disappear

    当view被添加到其他view中之前时,会调用viewWillAppear,而之后会调用viewDidAppear

    当view从其他view中移除之前时,会调用viewWillDisAppear,而之后会调用viewDidDisappear

    所以只有内存不够的时候或是程序被终止的时候,才会调用viewWillDisappear和viewDidDisappear

    loadView和viewDidLoad的区别就是,loadView时view还没有生成,viewDidLoad时,view已经生成了,loadView只会被调用一次,而viewDidLoad可能会被调用多次(view可能会被多次加载)。

    代码组织 -- 》如何设计良好的viewcontroller

    1. init里不要出现创建view的代码。在init里应该只有相关数据的初始化(非常重要),init里不要掉self.view,否则会导致viewcontroller创建view。(因为view是lazyinit的)。

    2. loadView中只初始化view,一般用于创建比较关键的view如tableViewController的tabView,UINavigationController的navigationBar。

    3. viewDidLoad这时候view已经有了,最适合创建一些附加的view和控件了。有一点需要注意的是,viewDidLoad会调用多次。

    4. viewWillAppear这个一般在view被添加到superview之前,切换动画之前调用。在这里可以进行一些显示器前的处理。比如键盘弹出,一些特殊的过程动画。

    5. viewDidAppear一般用于显示后。

  • 相关阅读:
    ORACLE删除当前用户下所有的表的方法
    解决Tomcat对POST请求文件上传大小的限制
    Windows下如何查看某个端口被谁占用
    javamail彻底解决中文乱码的方法
    Tomcat通过setenv.bat指定jdk和jre(相对路径)
    Linux nohup命令详解
    shell 重启java 程序
    jstack命令执行报错:Unable to open socket file: target process not responding or HotSpot VM not loaded
    ToStringBuilder.reflectionToString用法
    vue自定义指令+只能输入数字和英文+修改v-model绑定的值
  • 原文地址:https://www.cnblogs.com/wmx-rj/p/4858871.html
Copyright © 2011-2022 走看看