• 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控制器生存周期的更多相关文章

  1. iOS控制器的创建方式

    iOS控制器的创建.除了常见的alloc init外还有通过加载storyboard和xib的方式,下边逐一展开: 1.代码alloc init 创建方式 ViewController *vc= [[ ...

  2. iOS 控制器的生命周期(UIController)

    前言: 在iOS开发中,控制器的生命周期非常重要,什么时候加载页面,什么时候请求接口,什么时候刷新界面等等,都有很多值得优化的地方 loadView: 最先执行的方法,控制器关联的有Nib文件的时候, ...

  3. iOS控制器与视图加载方法

    转载记录, 请看原文: 1. iOS中的各种加载方法(initWithNibName,loadNibNamed,initWithCoder,awakeFromNib等等)简单使用   http://w ...

  4. iOS 控制器title和tabbar的title设置问题

    iOS 设置tabbarItem的title的是通过 controller.tabBarItem.title = @"标题" iOS 设置导航栏控制器title通过 contoll ...

  5. iOS控制器的生命周期分析和使用

    转自http://blog.csdn.net/qijianli/article/details/7826979 iOS的SDK中提供很多原生ViewController,大大提高了我们的开发效率,下面 ...

  6. ios控制器生命周期详解

    #import "MyOneViewController.h" @interface MyOneViewController () @property (nonatomic, st ...

  7. iOS控制器瘦身-面向超类编程

    今天写这篇文章的目的,是提供一种思路,来帮助大家解决控制器非常臃肿的问题,对控制器瘦身. 滴滴 老司机要开车了 如果手边有项目,不妨打开工程看一下你的控制器代码有多少行,是不是非常多?再看一下tabl ...

  8. 【iOS控制器跳转时,NavigationBar有阴影动画闪过的解决办法】

    如题,push控制器时,由于默认的控制器view是黑色,push到这个控制器时,navigationBar(默认是透明效果)后面有一个黑色阴影一闪而过,解决办法将navigationBar设为图片填充 ...

  9. ios控制器modal跳转

    1. http://www.cnblogs.com/smileEvday/archive/2012/05/29/presentModalViewController.html 2012年5月- Pre ...

随机推荐

  1. js脚本都可以放在哪些地方

    js脚本应该放在页面的什么地方 1.head部分 包含函数的脚本位于文档的 head 部分.这样我们就可以确保在调用函数前,脚本已经载入了. 2.body部分 执行位于 body 部分的脚本. 3.外 ...

  2. badboy录制兼容性有趣测试

    badboy录制默认是启动IE浏览器,使用badboy录制脚本时,遇到测试系统对IE浏览器不兼容时,就需要考虑换浏览器,修改为其他浏览器(如firefox.chrome)录制,只需要设置该浏览器为默认 ...

  3. 编写一个简单的Web Server

    编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...

  4. openvpn配置注意事项

    1.安装VPN安装结束后,需要配置CONFIG文件夹服务端及客户端的配置文件,建议从sample文件里直接拷贝修改,网上的一些案例会引起无法启动的问题,没仔细研究过是哪里错了,反正最后从sample里 ...

  5. Qlik报表开发见解

    因为项目需要,最近去做了Qlik Sense报表开发,学习了Qlik报表的开发方法和一些基础的开发模式,以下是我对Qlik报表开发的一些见解,个人水平有限,欢迎大神指导. 1.Qlik Sense的函 ...

  6. 细说Nullable<T>类型

    目录一.简介二.语法和用法三.类型的转换和运算四.装箱与拆箱五.GetType()方法六.ToString()方法七.System.Nullable帮助类八.语法糖 一.简介 众所周知,值类型变量不能 ...

  7. 数独小算法,测试通过(Java)

    class SudokuMatrix { private int[][] matrix = new int[][] { {0, 5, 0, 6, 0, 1, 0, 0, 0}, {0, 0, 7, 0 ...

  8. Entity Framework入门教程:创建实体数据模型

    下图为一个已经创建好的数据库表关系 实体数据模型的创建过程 在Visual Studio项目中,右键程序集菜单,选择[添加]->[新建项],在[添加新项窗口]中选择[ADO.NET实体数据模型] ...

  9. php产生随机字符串

    /** * 产生随机字符串 * * @param int $length 输出长度 * @param string $chars 可选的 ,默认为 0123456789 * @return strin ...

  10. js将时间戳转成格式化的时间

    function getLocalTime(nS){ return new Date(parseInt(nS) * 1000).toLocaleString().replace(/年|月/g, &qu ...