Swift - UIViewController生命周期详解(附:VC相关方法介绍)
2016-09-06 00:00
316 查看
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,这时原来视图就变成不可见的。后面我们又跳转回来,那么这个视图就又是可见的。
当视图的可见性发生变化时,视图控制器对应的方法也会随之响应。具体可见下图:
![](http://static.oschina.net/uploads/img/201609/06165747_e7cY.png)
特别要注意的是:Appearing 和 Disappearing 这两个状态是可以互相转化的。
3,测试样例说明
(1)ViewController 是首页视图控制器,我们将里面所有的与生命周期有关的函数都打印出来。
(2)同时 ViewController 中添加了一个“跳转”按钮,点击后跳转到另一个视图控制器(AnotherViewController)。
(3)AnotherViewController 里有个“返回”按钮,点击又会回到前一个页面。
![](http://static.oschina.net/uploads/img/201609/06165747_Bora.png)
4,测试代码 (1)ViewController.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | import UIKit class ViewController : UIViewController { //视图初始化 override func loadView() { super .loadView() ( "loadView" ) } //视图加载完成 override func viewDidLoad() { super .viewDidLoad() ( "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 ) { ( "viewWillAppear" ) } //视图显示完成后执行 override func viewDidAppear(animated: Bool ) { ( "viewDidAppear" ) } //视图将要消失的时候执行 override func viewWillDisappear(animated: Bool ) { ( "viewWillDisappear" ) } //视图已经消失的时候执行 override func viewDidDisappear(animated: Bool ) { ( "viewDidDisappear" ) } //收到内存警告时执行 override func didReceiveMemoryWarning() { super .didReceiveMemoryWarning() } //跳转到另一个视图 func jump(){ ( "点击按钮,开始跳转!" ) let anotherVC = AnotherViewController () presentViewController(anotherVC, animated: true , completion: nil ) } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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(){ ( "点击按钮,开始返回!" ) self .dismissViewControllerAnimated( true , completion: nil ) } override func didReceiveMemoryWarning() { super .didReceiveMemoryWarning() } } |
我们从 ViewController 跳到 AnotherViewController,再从 AnotherViewController 跳回 ViewController。整个控制台打印出来的流程如下:
![](http://static.oschina.net/uploads/img/201609/06165747_F4VI.png)
相关文章推荐
- VC编译多个相关Project方法点滴(续)
- VC《介绍一种巧妙的删除程序自己的方法》 - 电脑教程 - 天天加油
- Android学习笔记(5.2) ————SQLite的介绍与相关操作方法(各方法参数的详细说明)
- MySQL架构设计相关的方式方法和软件介绍
- Canvas类介绍以及相关方法
- 非窗口类中使用定时器的方法及相关知识的介绍
- 非窗口类中使用定时器的方法及相关知识的介绍
- VC 串口编程的方法介绍-VC API 串口编程_VC串口控件
- vc++中ado连接数据库的方法及详细介绍
- XML Document模型介绍之相关方法
- VC编译多个相关Project方法点滴(再续)
- C#调用VC DLL接口函数参数类型转换方法介绍
- Windows Mobile 软件安装方法及相关软件介绍
- C#调用VC DLL接口函数参数类型转换方法介绍
- C#调用VC DLL接口函数参数类型转换方法介绍
- 本文给出了一种方便实用的解决大文件的读取、存储等处理的方法,并结合相关程序代码对具体的实现过程进行了介绍
- PHP字符串替换的相关方法介绍
- [Python]开发环境相关搭建方法介绍
- 非窗口类中使用定时器的方法及相关知识的介绍
- VC位图按钮相关实现方法总结