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。整个控制台打印出
火柴人绳索英雄2无限金币版 (Stickman Rope Hero 2)安卓版v2.2v3.4.2
下载奥特曼之格斗超人内测版本 安卓最新版v11.0.0
下载奥特曼之格斗超人百度版 安卓版v11.0.0
下载奥特曼之格斗超人4399游戏盒版 最新安卓版v11.0.0
下载德凯奥特曼D闪光剑模拟器 安卓版v1.0
德凯奥特曼D闪光剑模拟器是一个非常有趣的奥特曼变身模拟器,可
亚刻觉醒器 安卓版v1.1
亚刻觉醒器模拟器是一个非常有趣的奥特曼变身模拟器,为喜欢亚刻
海上餐厅无限金币版 v1.0
海上餐厅免广告版是游戏的破解版本,在该版本中为玩家去除了广告
阿西美女室友竟然全解锁版 v1.0.2
阿西美女室友竟然内置菜单版是游戏的破解版本,在该版本中为玩家
我是大东家正版 最新版v1.2.738
我是大东家正版是一款放置类模拟经营手游,玩家将回到古代成为家