Swift UIViewController生命周期详解

UIViewController(视图控制器)想必大家都不会陌生,开发中常常会用到。这次讲讲它的生命周期。

1,视图的生命周期

说是 ViewController 的生命周期,其实指的是它控制的视图(View)的生命周期。每当视图的状态发生变化时,视图控制器会自动调用一系列方法来响应变化。
通过这些方法,我们就可以跟踪到视图的整个生命周期。各个方法按执行顺序排列如下:

(1)init:初始化程序

(2)loadView:视图初始化

这个方法不应该被直接调用,而是由系统自动调用。它会加载或创建一个 view 并把它赋值给 UIViewController 的 view 属性。
同时重写 loadView 方法的时候,不要调用父类的方法。

(3)viewDidLoad:视图加载完成,但还没在屏幕上显示出来
我们可以重写这个方法,对 view 做一些其他的初始化工作。比如可以移除一些视图,修改约束,加载数据等。

(3)viewWillAppear:在视图即将显示在屏幕上时调用

我们可以在这个方法里,改变当前屏幕方向或状态栏的风格等。

(4)viewDidApper:在视图显示在屏幕上时调用时调用

我们可以在这个方法中,对视图做一些关于展示效果方面的修改。

(5)viewWillDisappear:视图即将消失、被覆盖或是隐藏时调用

(6)viewDidDisappear:视图已经消失、被覆盖或是隐藏时调用

(7)viewVillUnload:当内存过低时,需要释放一些不需要使用的视图时,即将释放时调用
(8)viewDidUnload:当内存过低,释放一些不需要的视图时调用。
注意:自 iOS6 起,viewWillUnload 和 viewDidUnload 这两个方法被废除了。当系统发出内存警告的时候,会自动把 view 给清除掉,不用我们再特别处理。

同时系统还会调用 didReceiveMemoryWarning 方法通知视图控制器,我们可以在这里面进行一些操作,来释放一些额外的资源。(通常来说不用操作,比较最占资源的 view 已经被系统给清理了。)

2,视图状态的转换

在实际应用中,视图通常不会按照上面列的流程一次执行下来,可能会在可见与不可见的状态间互相转换。比如一开始视图是可见的,接着我们跳转到另一个 ViewController,这时原来视图就变成不可见的。后面我们又跳转回来,那么这个视图就又是可见的。
当视图的可见性发生变化时,视图控制器对应的方法也会随之响应。具体可见下图:

特别要注意的是:Appearing 和 Disappearing 这两个状态是可以互相转化的。

3,测试样例说明
(1)ViewController 是首页视图控制器,我们将里面所有的与生命周期有关的函数都打印出来。
(2)同时 ViewController 中添加了一个“跳转”按钮,点击后跳转到另一个视图控制器(AnotherViewController)。
(3)AnotherViewController 里有个“返回”按钮,点击又会回到前一个页面。

 

 

4,测试代码
(1)ViewController.swift

import UIKit
 
class ViewController: UIViewController {
    
    //视图初始化
    override func loadView() {
        super.loadView()
        print("loadView")
    }
    
    //视图加载完成
    override func viewDidLoad() {
        super.viewDidLoad()
        print("viewDidLoad")
        
        //创建跳转按钮
        let button:UIButton = UIButton(type: .System)
        button.frame=CGRectMake(10, 50, 100, 30)
        button.setTitle("跳转", forState: .Normal)
        button.addTarget(self,action:#selector(jump),forControlEvents:.TouchUpInside)
        self.view.addSubview(button);
    }
    
    //视图将要出现的时候执行
    override func viewWillAppear(animated: Bool) {
        print("viewWillAppear")
    }
    
    //视图显示完成后执行
    override func viewDidAppear(animated: Bool) {
        print("viewDidAppear")
    }
    
    //视图将要消失的时候执行
    override func viewWillDisappear(animated: Bool) {
        print("viewWillDisappear")
    }
    
    //视图已经消失的时候执行
    override func viewDidDisappear(animated: Bool) {
        print("viewDidDisappear")
    }
    
    //收到内存警告时执行
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    //跳转到另一个视图
    func jump(){
        print("点击按钮,开始跳转!")
        let anotherVC = AnotherViewController()
        presentViewController(anotherVC, animated: true, completion: nil)
    }
}

(2)AnotherViewController.swift

import UIKit
 
class AnotherViewController: UIViewController {
 
    override func viewDidLoad() {
        super.viewDidLoad()
 
        //创建返回按钮
        let button:UIButton = UIButton(type: .System)
        button.frame=CGRectMake(10, 150, 100, 30)
        button.setTitle("返回", forState: .Normal)
        button.addTarget(self,action:#selector(back),forControlEvents:.TouchUpInside)
        self.view.addSubview(button);
    }
    
    //返回之前视图
    func back(){
        print("点击按钮,开始返回!")
        self.dismissViewControllerAnimated(true, completion: nil)
    }
 
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

5,运行测试

我们从 ViewController 跳到 AnotherViewController,再从 AnotherViewController 跳回 ViewController。整个控制台打印出

时间: 2024-09-15 15:23:20

Swift UIViewController生命周期详解的相关文章

php的生命周期详解

php的生命周期 在常见的webserver环境中, 你不能直接启动php解释器; 一般是启动apache或其他webserver, 由它们加载php处理需要处理的脚本(请求的.php文档). 一切都从sapi开始 尽管看起来有所不同, 但实际上CLI的行为和web方式一致. 在命令行中键入php命令将启动"命令行sapi", 它实际上就像一个设计用于服务单请求的迷你版webserver. 当脚本运行完成后, 这个迷你的php-webserver终止并返回控制给shell. 启动和终止

Android开发之activity的生命周期详解_Android

本文实例讲述了Android activity的生命周期.分享给大家供大家参考,具体如下: activity类处于android.app包中,继承体系如下: 1.Java.lang.Object 2.android.content.Context 3.android.app.ApplicationContext 4.android.app.Activity activity是单独的,用于处理用户操作.几乎所有的activity都要和用户打交道,所以activity类创建了一个窗口,开发人员可以通

Android Activity生命周期详解_Android

Activity 的生命周期. 一.理解Activity Activity是Android程序的4大组件之一. Activity是Android程序的表示层.程序的每一个显示屏幕就是一个Activity. 学过WEB开发的同学,可以把Activity理解成网页中的一个JSP文件:或者你可以把它理解成一个Windows的窗口. 下面看一下Activity类的继承关系:    从这里可以看到Activity是Context类的子类,大家对此先有个印象.  二.理解Activity的生命周期 手机最重

ASP.NET深入浅出系列2-页面生命周期详解

上个系列中介绍了页面生命周期的整体流程,可能有些读者还想更进一步了解整个生命周期的细节,限于篇幅我不可能讲到所有细节,也没必要,这里仅举几个例子,大家可以通过这几个例子学习一下页面生命周期的研究方式. Control类中有如下事件 // 当服务器控件绑定到数据源时发生. public event EventHandler DataBinding; // 当从内存释放服务器控件时发生,这是请求 ASP.NET 页时服务器控件生存期的最后阶段. public event EventHandler D

Android编程中的四大基本组件与生命周期详解_Android

本文实例讲述了Android编程中的四大基本组件与生命周期.分享给大家供大家参考,具体如下: Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity : 应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应. Activity之间通过Intent进行通信.在Intent 的描述结构中,有两个最

Android Fragment的生命周期详解_Android

Fragments的生命周期        每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件. 对应生命周期可参考下图: 详解Android Fragment之二:Fragment的创建和生命周期         创建片元(Creating a Fragment)        To create a fragment, you must create a subclass of Fragment (or an existing subclass of it).

Servlet生命周期详解

一.基本概念Servlet生命周期分为三个阶段 1.初始化阶段                调用init()方法 2.响应客户请求阶段     调用service()方法 3.终止阶段                   调用destroy()方法 二.详解1.初始化阶段在下列时刻Servlet容器装载Servlet: ①Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的之间添加代码:<load-on-startup>1</load-on-star

JVM中的对象生命周期详解

在JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:创建阶段 (Creation).应用阶段(Using).不可视阶段(Invisible).不可到达阶段 (Unreachable).可收集阶段(Collected).终结阶段(Finalized)与释放 阶段(Free).上面的这7个阶段,构成了 JVM中对象的完整的生命周期.下面 分别介绍对象在处于这7个阶段时的不同情形. 创建阶段 在对象创建阶段,系统要通过下面的步骤,完成对象的创建过程: (1)为对象分配存储空间. (2)开始构造

MIDle生命周期详解,以及工作原理

 当MIDlet被应用程序管理器成功地初始化之后,就开始展开了它的生命周期.MIDlet的生命周期完全由应用程序管理器控制,也就是说,当MIDlet要从一个状态变成另外一个状态时,应用程序管理器会调用对应的回调函数(call back,也就是MIDlet类定义的那三个抽象方法).基本上,MIDlet有三种状态,分别是停止状态(Paused).激活状态(Active)以及消灭状态(Destroyed).MIDlet一开始一定是先进入停止状态,然后应用程序管理器再将它转换成激活状态,然后调用star