创建控制器的3种方式、深入了解view的创建和加载顺序
转载自:http://blog.csdn.net/weisubao/article/details/41012243
(1)创建控制器的3种方式
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- self.window=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
- [self.window makeKeyAndVisible];
- //关于主窗口
- //在iOS6之前,没有成为主窗口的话里面的文本框是无法输入文字
- self.window.backgroundColor=[UIColor redColor];
- //以下可以调出应用程序的主窗口和窗口数组
- //[UIApplication sharedApplication].windows;
- //[UIApplication sharedApplication].keyWindow;
- //第1种:直接alloc和init创建控制器
- //第2种:通过storyboard的instantiateInitialViewController或instantiateViewControllerWithIdentifier创建
- //因为我们设置了main Storyboard,所以系统自动生成了如下代码
- UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
- self.window.rootViewController=[storyboard instantiateInitialViewController];
- //如果我们自己创建一个storyboard,则加载时用
- UIStoryboard *two=[UIStoryboard storyboardWithName:@"two" bundle:nil];
- self.window.rootViewController=[two instantiateInitialViewController];
- //而如果two文件里有两个控制器,那么加载哪个就取决于storynoard ID
- UIStoryboard *three=[UIStoryboard storyboardWithName:@"two" bundle:nil];
- self.window.rootViewController=[three instantiateViewControllerWithIdentifier:@"hello"];
- //第3种:创建控制器的时候给它传入一个xib文件作为view
- //需先创建一个xib文件出来,然后把这个xib文件的file's owner改为这个视图控制器,并把该视图控制器的试图连接到创建的视图,这样下面的代码才有用
- //注意,在xib文件中创建视图时不要错误地创建一个控制器
- OneViewController *oneVc=[[OneViewController alloc]initWithNibName:@"OneXib" bundle:nil];
- self.window.rootViewController=oneVc;
- // Override point for customization after application launch.
- return YES;
- }
第三种创建方式的OneXib文件截图:
(2)view的创建过程
其实上面在创建控制器的时候已经创建了很多视图view。
——最简单地就是在storyboard中拖拽一个控制器,里面自带了view。
——最简单的还有用代码alloc init一个视图控制器后,也会有.view属性来描述视图。
——还有我们通过在xib文件中创建一个视图,并把这个视图连接给一个控制器,那么这个视图也会被加载
(3)那么问题来了:如果这么多视图都有出现,控制器到底先加载哪个视图?
——其实大BOSS都不是上面的那些,而是loadView中得视图才是最优先的(即只要视图控制器.m文件中在这个方法中自定义了视图,那么就优先加载这个视图,至于什么storyboard和xib里面的视图都是浮云)有如下代码,那么视图就是绿色的。
- -(void)loadView{
- self.view=[[UIView alloc]init];
- self.view.backgroundColor=[UIColor greenColor];
- }
所以视图创建或者加载的顺序是:
1、有loadView方法,就加载loadView里的视图view,这个方法就是用来自定义视图的。
2、如果没有loadView,则先看看有无storyboard,如果有storyboard,就按照storyboard的名称去加载里面的view。
3、如果没有storyboard,则加载xib里面的view。此时的顺序是:
3.1、如果指定了xib的名称,则加载响应里面的view;
3.2、如果没有指定名称,则加载与控制器名称前缀相同的xib里地视图,如控制器名称是WPViewController,那么优先加载名字叫WPView的xib文件里地视图view。
3.2、其次,如果没有叫WPView的xib文件,则加载与控制器同名的xib里的视图,即加载WPViewController里的view。
3.3、如果都没有,则加载个空白view。
(4)现象:loadView只调用一次,即第1次打开程序的时候发现没有view,则先去找loadView,如果有的话就创建view,如果没有另找他法。加载过之后,第2次就不会再调用loadView了。所以,如下代码是一个死循环,因为它一直在找view。
- -(void)loadView{
- self.view.backgroundColor=[UIColor greenColor];
- }
(5)记住:控制器的view也是延迟加载的,即用到的时候才加载,也就是调用viewDidLoad方法,可以用打印输入来验证。
(6)还有一种创建xib的方式,就是在创建控制器的同时创建一个xib文件,这个xib文件的名称和视图控制器的名称同名,这也验证了我们上面view加载时候对xib名称的描述。所以命名还是有讲究的,不能随便命名。
创建控制器的3种方式、深入了解view的创建和加载顺序的更多相关文章
- javascript创建类的6种方式
javascript创建类的7种方式 一 使用字面量创建 1.1 示例 var obj={}; 1.2 使用场景 比较适用于临时构建一个对象,且不关注该对象的类型,只用于临时封装一次数据,且不适合代码 ...
- spring创建bean的三种方式
spring创建bean的三种方式: 1通过构造方法创建bean(最常用) 1.1 spring默认会通过无参构造方法来创建bean,如果xml文件是这样配置,则实体类中必须要有无参构造方法,无参构造 ...
- Java创建线程的四种方式
Java创建线程的四种方式 1.继承Thread类创建线程 定义Thread类的子类,并重写该类的run方法,run()方法的内容就是该线程执行的内容 创建Thread子类的实例,即创建了线程对象. ...
- 0036 Java学习笔记-多线程-创建线程的三种方式
创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...
- 【java并发】传统线程技术中创建线程的两种方式
传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...
- js学习-DOM之动态创建元素的三种方式、插入元素、onkeydown与onkeyup两个事件整理
动态创建元素的三种方式: 第一种: Document.write(); <body> <input type="button" id="btn" ...
- 创建TabHost的两种方式的简单分析
最近做了一个TabHost的界面,在做的过程中发现了一些问题,故和大家分享一下. 首先我的界面如下: 目前就我所知,创建TabHost有两种方式,第一种是继承TabActivity类,然后用getTa ...
- Java创建线程的第二种方式:实现runable接口
/*需求:简单的卖票程序多个窗口买票 创建线程的第二种方式:实现runable接口 *//*步骤1.定义类实现Runable接口2.覆盖Runable接口中的run方法 将线程要运行的代码存放在 ...
- 创建线程的两种方式比较Thread VS Runnable
1.首先来说说创建线程的两种方式 一种方式是继承Thread类,并重写run()方法 public class MyThread extends Thread{ @Override public vo ...
随机推荐
- c语言_头文件
传统 C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <assert.h> //设定插入点 #include <ctyp ...
- 《C++ Primer》之重载操作符与转换(中)
赋值操作符 类赋值操作符接受类类型形参,通常,该形参是对类类型的 const 引用,但也可以是类类型或对类类型的非 const 引用.如果没有定义这个操作符,则编译器将合成它.类赋值操作符必须是类的成 ...
- java se 另一博客
http://blog.csdn.net/terryzero/article/category/517680
- [转]Flash、Flex、AS3.0框架及类库资源收集之十全大补
原文地址:http://www.d5power.com/portal.php?mod=view&aid=27 APIs.Libs.Components1.as3ebaylibhttp://co ...
- centos中apache-tomcat的配置
在centos中配置Apache-toncat需要先安装jdk,前面文章已经写了怎么配置jdk,这里略过. 首先到官网下载好Apache-tomcat安装包,我这里下载的是apache-tomcat- ...
- isPostBack原理
从 到输入用户名,点击提交按钮 这个过程就叫做postback(是两个不同的状态) 利用ispostback原理,实现是否第一次进入处理程序(上一个用用户名判断的不好,会导致在用户名空的情况下 ...
- MySQL 视图 总结
什么是视图 视图是从一个或多个表中导出来的表,是一种虚拟存在的表. 视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据. 这样,用户可以不用看到整个数据库中的数据,而之关心对自己有用的数据. 数 ...
- html 背景透明文字不透明
.alpha{ width: 100px; height: 100px; color: #fff; background: rgba(0, 0, 0, .3); filter: progid:DXIm ...
- preg_replace 方法
标红关键字 $text = "Sample sentence from KomunitasWeb, regex has become popular in web programming. ...
- Converting between IEEE 754 and Float (Format related
The float can be converted to well known single-precision IEEE 754 number, why 754? It's the standar ...