ios控制器生存周期
- iOS中控制器的生命周期
一般我们在创建控制器的时候,有三种方法。
1. 直接通过代码创建
2. 通过storyboard创建
3. 通过Xib,在创建控制器的时候传入一个Xib文件作为这个控制器的view。
- 直接通过代码创建
通过代码创建这种凡是,我们打印调用顺序可以发现
对应的代码调用顺序就是 loadView -> viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear
// 1.
- (void)loadView; // This is where subclasses should create their custom view
hierarchy if they aren't using a nib. Should never be called directly. // 2.
- (void)viewDidLoad; // Called after the view has been loaded. For view controllers created in code, this is after -loadView. For view controllers unarchived from a nib, this is after the view is set. // 3.
- (void)viewWillAppear:(BOOL)animated; // Called when the view is about to made visible. Default does nothing // 4.
- (void)viewWillLayoutSubviews NS_AVAILABLE_IOS(5_0);
// Called just after the view controller's view's layoutSubviews method is invoked. Subclasses can implement as necessary. The default is a nop. // 5.
- (void)viewDidLayoutSubviews NS_AVAILABLE_IOS(5_0);
控制器创建之后,弹出另一个控制器(当前控制器消失),执行的代码顺序 viewWillDisappear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidDisappear
// 1.
- (void)viewWillDisappear:(BOOL)animated; // Called when the view is dismissed, covered or otherwise hidden. Default does nothing // 2.
- (void)viewWillLayoutSubviews NS_AVAILABLE_IOS(5_0);
// Called just after the view controller's view's layoutSubviews method is invoked. Subclasses can implement as necessary. The default is a nop. // 3.
- (void)viewDidLayoutSubviews NS_AVAILABLE_IOS(5_0); // 4.
- (void)viewDidDisappear:(BOOL)animated; // Called after the view was dismissed, covered or otherwise hidden. Default does nothing
- 通过storyboard创建控制器
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:NSStringFromClass([CViewController class]) bundle:nil];
CViewController *touch = [storyBoard instantiateViewControllerWithIdentifier:NSStringFromClass([CViewController class])];
[self presentViewController:touch animated:YES completion:nil];
为了方便,同时减少手误,这里重用ID我们使用类名
通过打印来观察
可以看到代码的调用顺序就是 awakeFromNib -> loadView -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear
// 1.
- (void)awakeFromNib NS_REQUIRES_SUPER; // 2.
- (void)loadView; // This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly. // 3.
- (void)viewDidLoad; // Called after the view has been loaded. For view controllers created in code, this is after -loadView. For view controllers unarchived from a nib, this is after the view is set. // 4.
- (void)viewWillAppear:(BOOL)animated; // Called when the view is about to made visible. Default does nothing // 5.
- (void)viewWillLayoutSubviews NS_AVAILABLE_IOS(5_0);
// Called just after the view controller's view's layoutSubviews method is invoked. Subclasses can implement as necessary. The default is a nop.
- (void)viewDidLayoutSubviews NS_AVAILABLE_IOS(5_0); // 6.
- (void)viewDidAppear:(BOOL)animated; // Called when the view has been fully transitioned onto the screen. Default does nothing
这里需要注意的是,我们是控制器通过storyboard来加载,那么是根据storyboard的描述创建view。
- 通过XIB来创建加载控制器
首先创建一个XIB,快捷键 command + N 来创建。
创建后XIB之后我们还需要设置文件
- 这里设置为我们创建的控制器
所有需要的已经设置好,这时候我们可以来码代码了。
DViewController *touch = [[DViewController alloc] initWithNibName:NSStringFromClass([DViewController class]) bundle:nil];
[self presentViewController:touch animated:YES completion:nil];
下面我们来观察控制器的生命周期
代码层面上就是
// 1.
- (void)loadView; // This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly. // 2.
- (void)viewDidLoad; // Called after the view has been loaded. For view controllers created in code, this is after -loadView. For view controllers unarchived from a nib, this is after the view is set. // 3.
- (void)viewWillAppear:(BOOL)animated; // Called when the view is about to made visible. Default does nothing // 4.可能会多次调用
- (void)viewWillLayoutSubviews NS_AVAILABLE_IOS(5_0);
// Called just after the view controller's view's layoutSubviews method is invoked. Subclasses can implement as necessary. The default is a nop.
- (void)viewDidLayoutSubviews NS_AVAILABLE_IOS(5_0); // 5.
- (void)viewDidAppear:(BOOL)animated; // Called when the view has been fully transitioned onto the screen. Default does nothing
说明:
加载XIB的时候,我们同样可以不指定XIB名称,这样loadView 就会最终加载与控制器同名的 XIB (命名规范很重要啊)
DViewController *touch = [[DViewController alloc] init];
[self presentViewController:touch animated:YES completion:nil];
同时,如果我们删掉 DViewController.xib ,同时创建一个 DView.xib 当我们用以上不指定xib名称,同样是可以加载出来的(命名规范很重要)。
我们可以知道,加载xib的过程是,如果指定名称,那么加载指定名称的xib,如果没有指定名称就会加载和控制器同名的xib,如果没有就会找去控制器名相同但是没有 controller 的xib来加载。
- A present B控制器再返回,两个控制器的生命周期
1. 创建A控制器
流程:
A:loadView
A:viewDidLoad
A:viewWillAppear
A:viewWillLayout...
A:viewDidAppear
2. A present 到B控制器
流程:
A:loadView
A:viewDidLoad
A:viewWillAppear
A:viewWillLayout... // 可能多次调用
A:viewDidAppear -------------- Present B控制器 -------------- B:loadView
B:viewDidLoad A:viewWillDisappear B:viewWillAppear
B:viewLayout.... // 可能多次调用 A;viewLayout... // 可能多次调用 B:viewDidAppear // 多次调用,会跟下面的调用顺序可能会有些调换 A:viewDidDisappear
ios控制器生存周期的更多相关文章
- iOS控制器的创建方式
iOS控制器的创建.除了常见的alloc init外还有通过加载storyboard和xib的方式,下边逐一展开: 1.代码alloc init 创建方式 ViewController *vc= [[ ...
- iOS 控制器的生命周期(UIController)
前言: 在iOS开发中,控制器的生命周期非常重要,什么时候加载页面,什么时候请求接口,什么时候刷新界面等等,都有很多值得优化的地方 loadView: 最先执行的方法,控制器关联的有Nib文件的时候, ...
- iOS控制器与视图加载方法
转载记录, 请看原文: 1. iOS中的各种加载方法(initWithNibName,loadNibNamed,initWithCoder,awakeFromNib等等)简单使用 http://w ...
- iOS 控制器title和tabbar的title设置问题
iOS 设置tabbarItem的title的是通过 controller.tabBarItem.title = @"标题" iOS 设置导航栏控制器title通过 contoll ...
- iOS控制器的生命周期分析和使用
转自http://blog.csdn.net/qijianli/article/details/7826979 iOS的SDK中提供很多原生ViewController,大大提高了我们的开发效率,下面 ...
- ios控制器生命周期详解
#import "MyOneViewController.h" @interface MyOneViewController () @property (nonatomic, st ...
- iOS控制器瘦身-面向超类编程
今天写这篇文章的目的,是提供一种思路,来帮助大家解决控制器非常臃肿的问题,对控制器瘦身. 滴滴 老司机要开车了 如果手边有项目,不妨打开工程看一下你的控制器代码有多少行,是不是非常多?再看一下tabl ...
- 【iOS控制器跳转时,NavigationBar有阴影动画闪过的解决办法】
如题,push控制器时,由于默认的控制器view是黑色,push到这个控制器时,navigationBar(默认是透明效果)后面有一个黑色阴影一闪而过,解决办法将navigationBar设为图片填充 ...
- ios控制器modal跳转
1. http://www.cnblogs.com/smileEvday/archive/2012/05/29/presentModalViewController.html 2012年5月- Pre ...
随机推荐
- js脚本都可以放在哪些地方
js脚本应该放在页面的什么地方 1.head部分 包含函数的脚本位于文档的 head 部分.这样我们就可以确保在调用函数前,脚本已经载入了. 2.body部分 执行位于 body 部分的脚本. 3.外 ...
- badboy录制兼容性有趣测试
badboy录制默认是启动IE浏览器,使用badboy录制脚本时,遇到测试系统对IE浏览器不兼容时,就需要考虑换浏览器,修改为其他浏览器(如firefox.chrome)录制,只需要设置该浏览器为默认 ...
- 编写一个简单的Web Server
编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...
- openvpn配置注意事项
1.安装VPN安装结束后,需要配置CONFIG文件夹服务端及客户端的配置文件,建议从sample文件里直接拷贝修改,网上的一些案例会引起无法启动的问题,没仔细研究过是哪里错了,反正最后从sample里 ...
- Qlik报表开发见解
因为项目需要,最近去做了Qlik Sense报表开发,学习了Qlik报表的开发方法和一些基础的开发模式,以下是我对Qlik报表开发的一些见解,个人水平有限,欢迎大神指导. 1.Qlik Sense的函 ...
- 细说Nullable<T>类型
目录一.简介二.语法和用法三.类型的转换和运算四.装箱与拆箱五.GetType()方法六.ToString()方法七.System.Nullable帮助类八.语法糖 一.简介 众所周知,值类型变量不能 ...
- 数独小算法,测试通过(Java)
class SudokuMatrix { private int[][] matrix = new int[][] { {0, 5, 0, 6, 0, 1, 0, 0, 0}, {0, 0, 7, 0 ...
- Entity Framework入门教程:创建实体数据模型
下图为一个已经创建好的数据库表关系 实体数据模型的创建过程 在Visual Studio项目中,右键程序集菜单,选择[添加]->[新建项],在[添加新项窗口]中选择[ADO.NET实体数据模型] ...
- php产生随机字符串
/** * 产生随机字符串 * * @param int $length 输出长度 * @param string $chars 可选的 ,默认为 0123456789 * @return strin ...
- js将时间戳转成格式化的时间
function getLocalTime(nS){ return new Date(parseInt(nS) * 1000).toLocaleString().replace(/年|月/g, &qu ...