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文件是为哪个类(控制器)服务的。任何视图(比如UIViewxidstoryboard等)设置了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");

}

/**

viewwindow上完全移除(完全看不见)

*

*/

- (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开发之控制器创建与加载(生命周期)的更多相关文章

  1. iOS开发UI篇-懒加载、重写setter方法赋值

    一.懒加载 1.懒加载定义 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再 ...

  2. iOS开发——网络Swift篇&NSURLSession加载数据、下载、上传文件

    NSURLSession加载数据.下载.上传文件   NSURLSession类支持三种类型的任务:加载数据.下载和上传.下面通过样例分别进行介绍.   1,使用Data Task加载数据 使用全局的 ...

  3. IOS开发UI篇之──自定义加载等待框(MBProgressHUD)

    本文转载至 http://blog.csdn.net/xunyn/article/details/8064984   原文地址http://www.189works.com/article-89289 ...

  4. 【iOS开发】UIViewController的基本概念与生命周期

    http://www.cnblogs.com/wayne23/p/3868535.html UIViewController是iOS顶层视图的载体及控制器,用户与程序界面的交互都是由UIViewCon ...

  5. ios开发之--MJRefresh上拉加载的时候,tableview会向上偏移

    1,出现这种情况的原因: 这个应该是UITableView最大的改变.我们知道在iOS8引入Self-Sizing之后,我们可以通过实现estimatedRowHeight相关的属性来展示动态的内容, ...

  6. iOS之深入了解控制器View的加载

    前言 在面试中,面试官可能会问这样的问题,loadView有什么作用,它与viewDidLoad有何区别 首先我们得知道,控制器view是通过懒加载的方式进行加载的,即用到的时候再加载. loadVi ...

  7. Delphi for iOS开发指南(3):创建一个FireMonkey iOS应用程序

    http://cache.baiducontent.com/c?m=9d78d513d9d431a94f9d92697d60c015134381132ba1d0020fa48449e3732b4b50 ...

  8. 控制器View的加载过程

    1.控制器内部的view是延迟加载 1> 用到时再加载2> 加载完毕后会调用控制器的viewDidLoad方法 2.创建控制器的方式 1> 直接通过代码创建OneViewContro ...

  9. iOS开发 纯代码创建UICollectionView

    转:http://jingyan.baidu.com/article/eb9f7b6d8a81a5869364e8a6.html iOS开发 纯代码创建UICollectionView 习惯了使用xi ...

随机推荐

  1. echarts 显示下载按钮,echarts 自定义按钮,echarts 添加按钮

    echarts 显示下载按钮,echarts 自定义按钮,echarts 添加按钮 >>>>>>>>>>>>>>&g ...

  2. list_删除元素

    项目遇到了题目所述的问题,还是折腾了一会... 现在总结一下: 这里写一个测试小程序: List<Integer> ints = new ArrayList<Integer>( ...

  3. 内存管理 (C++)

    转:http://hi.baidu.com/%D0%A1%B0%FC%D7%D349/blog/item/de1a8e4fa5eeafc3d0c86a68.html1.进程地址空间    Window ...

  4. ReactNative入门(2)ECMAScript 6简介

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. ...

  5. 在SQL Server里如何处理死锁

    在今天的文章里,我想谈下SQL Server里如何处理死锁.当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作.首先我想给你大致讲下SQL Server如何处理死锁.最后我会展示下SQL ...

  6. hibernate系列笔记(1)---Hibernate增删改查

    Hibernate增删改查 1.首先我们要知道什么是Hibernate Hibernate是一个轻量级的ORMapping对象.主要用来实现Java和数据库表之间的映射,除此之外还提供数据查询和数据获 ...

  7. 每天一个Linux命令(14)--head命令

    head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然的就是查看档案的结尾啦. 1.命令格式: h ...

  8. 版本控制器——Egit使用方法

    什么是Git Gitv是目前世界上最先进的分布式版本控制系统. 那我们为什么需要学习Git呢?因为在我们传统的java自学中,所有的项目都是自己独立开发完成,而且项目基本都是小型项目,在优化和体验上往 ...

  9. TypeScript设计模式之门面、适配器

    看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...

  10. Prince2是怎么考试的?想了解P2

    自己在项目管理培训的行业已经有了5年的时间,经历了很多的学员和企业,和他们交流的问题,话题也很多. 在前几年,对于项目经理来讲关注的很多是单项目管理的工具技术模板,谈论最多的是,进度延期,成本超支,范 ...