iOS开发之控制器创建与加载(生命周期)
1、如何创建一个控制器
控制器常见的创建方式有以下几种:
(1)通过storyboard创建
(2)直接创建
MJViewController *mj = [[MJViewController alloc] init];
(3)指定xib文件来创建
MJViewController *mj = [[MJViewController alloc] initWithNibName:
@"MJViewController" bundle:nil];
注意,创建xid后还要设置xid中哪个view是ControllerView的view(而用storyboard创建控制器却不用设置因为系统已经自动设置过了),设置方法为:
首先把File`s Owner设置为控制器,如下图:
表示这个xid文件是为哪个类(控制器)服务的。任何视图(比如UIView、xid、storyboard等)设置了class,都代表那个视图是为那个类服务的,即从那个类中操作这个视图中的控件或初始化这个视图等。
然后设置控制器的view是哪个view,方法为右键File`s Owner拖view选项到相关view上,如下图:
如果在创建继承ViewController的类时勾选下面选项就可以省略这个步骤(会自动创建xid文件并自动完成上述步骤):
通过xid创建控制器时,如果新建的控制器名称和xid文件的名称一样,则可以通过以下三种方式将它设置为rootViewController:
方式一:
self.window.rootViewController =
[[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];
方式二:
self.window.rootViewController = [[MJViewController alloc] initWithNibName:nil bundle:nil];
这里将initWithNibName参数设置为nil,等价于方法三,首先会去找文件名为MJView.xid的作为初始化时的xid文件,如果没找到MJView.xid文件,则会去寻找文件名为MJViewController.xid的作为初始化的xid文件。
方式三:
self.window.rootViewController = [[MJViewController alloc] init];
【备注】苹果官方推荐在控制器的ViewLoad方法中创建控制器的view。
2、通过storyboard创建控制器详解
(1)先加载storyboard文件(Test是storyboard的文件名)
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
(2)接着初始化storyboard中的控制器
初始化“初始控制器”(箭头所指的控制器)
MJViewController *mj = [storyboard instantiateInitialViewController];
通过一个标识初始化对应的控制器
MJViewController *mj =
[storyboard instantiateViewControllerWithIdentifier:@”mj"];
例如,新建storyboard文件(two. storyboard),向里面拖入一个ViewController,如何将这个storyboard文件中的ViewController显示到UIWindow呢?
首先,要加载这个storyboard:
UIStoryboard *storyboard =
[UIStoryboard storyboardWithName:@"Two" bundle:nil];
然后使用这个storyboard创建ViewController,现在我们新建一个类MJTwoViewController,它继承自ViewControlle,然后:
MJTwoViewController *vc = [storyboard instantiateInitialViewController];
最后将这个控制器设置为rootViewController即可:
self.window.rootViewController = vc;
如果storyboard中有多个ViewController,可以使用下列方法加载指定ViewController:
MJTwoViewController *vc =
[storyboard instantiateViewControllerWithIdentifier:@"myID"];
如果我们想为storyboard中ViewController中的控件设置事件,比如按钮点击事件,我们只需往MJTwoViewController中拖线并实现相应方法即可。
3、控制器view的加载
控制器的view是延迟加载的:用到时再加载。
可以用isViewLoaded方法判断一个UIViewController的view是否已经被加载。
控制器的view加载完毕就会调用viewDidLoad方法。
3、 多控制器
一个iOS的app很少只由一个控制器组成,除非这个app极其简单。当app中有多个控制器的时候,我们就需要对这些控制器进行管理。有多个view时,可以用一个大的view去管理1个或者多个小view。控制器也是如此,用1个控制器去管理其他多个控制器。
比如,用一个控制器A去管理3个控制器B、C、D:控制器A被称为控制器B、C、D的“父控制器”。控制器B、C、D的被称为控制器A的“子控制器”。
为了便于管理控制器,iOS提供了2个比较特殊的控制器:
UINavigationController
UITabBarController
5、控制器的生命周期
/**
* view加载完毕
*/
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"MJOneViewController-viewDidLoad");
}
/**
* view即将显示到window上
*
*/
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"MJOneViewController-viewWillAppear");
}
/**
* view显示完毕(已经显示到窗口)
*/
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"MJOneViewController-viewDidAppear");
}
/**
* view即将从window上移除(即将看不见)
*
*/
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
NSLog(@"MJOneViewController-viewWillDisappear");
}
/**
* view从window上完全移除(完全看不见)
*
*/
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
NSLog(@"MJOneViewController-viewDidDisappear");
}
/**
* view即将销毁的时候调用
*/
- (void)viewWillUnload
{
[super viewWillUnload];
}
/**
* view销毁完毕的时候调用
*/
- (void)viewDidUnload
{
[super viewDidUnload];
}
/**
* 当接收到内存警告的时候
*/
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
【备注】控制器中还有一个方法:
— (void)loadView;
这个方法是加载控制器中的View时候调用的,通常我们靠重写这个方法去改变控制器的View。
iOS开发之控制器创建与加载(生命周期)的更多相关文章
- iOS开发UI篇-懒加载、重写setter方法赋值
一.懒加载 1.懒加载定义 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再 ...
- iOS开发——网络Swift篇&NSURLSession加载数据、下载、上传文件
NSURLSession加载数据.下载.上传文件 NSURLSession类支持三种类型的任务:加载数据.下载和上传.下面通过样例分别进行介绍. 1,使用Data Task加载数据 使用全局的 ...
- IOS开发UI篇之──自定义加载等待框(MBProgressHUD)
本文转载至 http://blog.csdn.net/xunyn/article/details/8064984 原文地址http://www.189works.com/article-89289 ...
- 【iOS开发】UIViewController的基本概念与生命周期
http://www.cnblogs.com/wayne23/p/3868535.html UIViewController是iOS顶层视图的载体及控制器,用户与程序界面的交互都是由UIViewCon ...
- ios开发之--MJRefresh上拉加载的时候,tableview会向上偏移
1,出现这种情况的原因: 这个应该是UITableView最大的改变.我们知道在iOS8引入Self-Sizing之后,我们可以通过实现estimatedRowHeight相关的属性来展示动态的内容, ...
- iOS之深入了解控制器View的加载
前言 在面试中,面试官可能会问这样的问题,loadView有什么作用,它与viewDidLoad有何区别 首先我们得知道,控制器view是通过懒加载的方式进行加载的,即用到的时候再加载. loadVi ...
- Delphi for iOS开发指南(3):创建一个FireMonkey iOS应用程序
http://cache.baiducontent.com/c?m=9d78d513d9d431a94f9d92697d60c015134381132ba1d0020fa48449e3732b4b50 ...
- 控制器View的加载过程
1.控制器内部的view是延迟加载 1> 用到时再加载2> 加载完毕后会调用控制器的viewDidLoad方法 2.创建控制器的方式 1> 直接通过代码创建OneViewContro ...
- iOS开发 纯代码创建UICollectionView
转:http://jingyan.baidu.com/article/eb9f7b6d8a81a5869364e8a6.html iOS开发 纯代码创建UICollectionView 习惯了使用xi ...
随机推荐
- java_监控工具jvisualvm
转:使用 VisualVM 进行性能分析及调优 启动:jvisualvm 首先到JDK安装目录/bin目录下,双击jvisualvm.exe文件启动 需要注意的是:当OS所在分区是FAT格式时,Vis ...
- InfluxDB读写性能测试
今天进行了InfluxDB和MySQL的对比测试,这里记录下结果,也方便我以后查阅. 操作系统: CentOS6.5_x64InfluxDB版本 : v1.1.0MySQL版本:v5.1.73CPU ...
- STM32单片机学习心得——概述
我校的课程真是跟不上时代发展,甚至还在教授8051/8052单片机的内容,于是不甘寂寞的我就自己踏入了STM32单片机的坑-- 首先,我现在大二,刚学完模拟电子技术,还没有学习数字电路技术,于是自学单 ...
- 使用vlmcsd自建KMS服务~一句命令激活windows/office
服务作用:在线激活windows和office 适用对象:VOL版本的windows和office 适用版本:截止到win10和office2016的所有版本 服务时间:24H,偶尔更新维护 优点:在 ...
- CentOS 6.5安装jdk1.8
1.源码包准备: 首先到官网下载jdk-8u66-linux-x64.tar.gz, http://www.oracle.com/technetwork/java/javase/downloads/j ...
- Python爬虫爬取qq视频等动态网页全代码
环境:py3.4.4 32位 需要插件:selenium BeautifulSoup xlwt # coding = utf-8 from selenium import webdriverfrom ...
- xml中的SQL注入
大家通常知道xml中大部分会导致外部实体注入,但是,xml也会出现SQL注入: 在xml中正常的sql语句写法有两种: 第一: <select id="selectById" ...
- mongodb c api编译
1. autoconf-latest.tar.gz http://ftp.gnu.org/gnu/autoconf/ tar xzvf autoconf-latest.tar.gz ./configu ...
- failed (1113: No mapping for the Unicode character exists in the target multi-byte code page), client: 127.0.0.1...
nginx部署网站后,访问域名,网页显示 500 Internal Server Error ,经查看发现nginx的error.log中有报错: failed (1113: No mapping ...
- Number()、parseInt()、parseFloat()的区别
最近在一个项目中遇到:需要在前台页面用javascript去处理很数值的计算. 各种用法都有,为了统一且保证处理方式正确,特地总结了一下相关的数值转换的用法: 作用: Number():可以用于任何数 ...