创建控制器的3种方式、深入了解view的创建和加载顺序

转载自:http://blog.csdn.net/weisubao/article/details/41012243

(1)创建控制器的3种方式

[objc] view plaincopy

  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  2. self.window=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
  3. [self.window makeKeyAndVisible];
  4. //关于主窗口
  5. //在iOS6之前,没有成为主窗口的话里面的文本框是无法输入文字
  6. self.window.backgroundColor=[UIColor redColor];
  7. //以下可以调出应用程序的主窗口和窗口数组
  8. //[UIApplication sharedApplication].windows;
  9. //[UIApplication sharedApplication].keyWindow;
  10. //第1种:直接alloc和init创建控制器
  11. //第2种:通过storyboard的instantiateInitialViewController或instantiateViewControllerWithIdentifier创建
  12. //因为我们设置了main Storyboard,所以系统自动生成了如下代码
  13. UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
  14. self.window.rootViewController=[storyboard instantiateInitialViewController];
  15. //如果我们自己创建一个storyboard,则加载时用
  16. UIStoryboard *two=[UIStoryboard storyboardWithName:@"two" bundle:nil];
  17. self.window.rootViewController=[two instantiateInitialViewController];
  18. //而如果two文件里有两个控制器,那么加载哪个就取决于storynoard ID
  19. UIStoryboard *three=[UIStoryboard storyboardWithName:@"two" bundle:nil];
  20. self.window.rootViewController=[three instantiateViewControllerWithIdentifier:@"hello"];
  21. //第3种:创建控制器的时候给它传入一个xib文件作为view
  22. //需先创建一个xib文件出来,然后把这个xib文件的file‘s owner改为这个视图控制器,并把该视图控制器的试图连接到创建的视图,这样下面的代码才有用
  23. //注意,在xib文件中创建视图时不要错误地创建一个控制器
  24. OneViewController *oneVc=[[OneViewController alloc]initWithNibName:@"OneXib" bundle:nil];
  25. self.window.rootViewController=oneVc;
  26. // Override point for customization after application launch.
  27. return YES;
  28. }

第三种创建方式的OneXib文件截图:

(2)view的创建过程

其实上面在创建控制器的时候已经创建了很多视图view。

——最简单地就是在storyboard中拖拽一个控制器,里面自带了view。

——最简单的还有用代码alloc init一个视图控制器后,也会有.view属性来描述视图。

——还有我们通过在xib文件中创建一个视图,并把这个视图连接给一个控制器,那么这个视图也会被加载

(3)那么问题来了:如果这么多视图都有出现,控制器到底先加载哪个视图?

——其实大BOSS都不是上面的那些,而是loadView中得视图才是最优先的(即只要视图控制器.m文件中在这个方法中自定义了视图,那么就优先加载这个视图,至于什么storyboard和xib里面的视图都是浮云)有如下代码,那么视图就是绿色的。

[objc] view plaincopy

  1. -(void)loadView{
  2. self.view=[[UIView alloc]init];
  3. self.view.backgroundColor=[UIColor greenColor];
  4. }

所以视图创建或者加载的顺序是:

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。

[objc] view plaincopy

  1. -(void)loadView{
  2. self.view.backgroundColor=[UIColor greenColor];
  3. }

(5)记住:控制器的view也是延迟加载的,即用到的时候才加载,也就是调用viewDidLoad方法,可以用打印输入来验证。

(6)还有一种创建xib的方式,就是在创建控制器的同时创建一个xib文件,这个xib文件的名称和视图控制器的名称同名,这也验证了我们上面view加载时候对xib名称的描述。所以命名还是有讲究的,不能随便命名。

时间: 2024-10-21 18:35:45

创建控制器的3种方式、深入了解view的创建和加载顺序的相关文章

ios中创建控制器的几种方式

1.通过storyboard创建: (1)先加载storyboard文件: UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@"Test"  bundle:nil]; (2) 初始化storyboard中的控制器: ①初始化"初始控制器":HLViewController * hl = [storyboard instantiateInitialViewController]; ②通过标识初始

【iOS开发-73】创建控制器的3种方式、深入了解view的创建和加载顺序

(1)创建控制器的3种方式 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; [self.window makeKeyAndVisible]; //关于主窗口 //在iOS6之前,

创建控制器的几种方式

1 通过nib方式 // bundle:nil参数传nil,指的是从mainbundle中加载,mainbundle中包含项目中所有的资源 MJThreeViewController *three = [[MJThreeViewController alloc] initWithNibName:@"MJThree5345" bundle:nil]; self.window.rootViewController = three; 2 通过代码的方式 // 根据代码创建控制器 UIView

大数据基础教程:创建RDD的二种方式

大数据基础教程:创建RDD的二种方式 1.从集合中创建RDD val conf = new SparkConf().setAppName("Test").setMaster("local")      val sc = new SparkContext(conf)      //这两个方法都有第二参数是一个默认值2  分片数量(partition的数量)      //scala集合通过makeRDD创建RDD,底层实现也是parallelize      val 

ios UI加载xib文件到控制器的两种方式(MS)

X-code6.3 创建xib文件 加载xib文件到控制器的两种方式(MS) // 1.第一种方式 //    NSArray * array = [[NSBundle mainBundle]loadNibNamed:@"cell" owner:nil options:nil]; //    MyTableViewCell * cell = [array firstObject]; 其中cell为新建的xib文件名 // 2.第二种方式 UINib * nib = [UINib nib

java创建线程的三种方式及其对比

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法,run方法的方

创建TabHost的两种方式的简单分析

最近做了一个TabHost的界面,在做的过程中发现了一些问题,故和大家分享一下. 首先我的界面如下: 目前就我所知,创建TabHost有两种方式,第一种是继承TabActivity类,然后用getTabHost方法来得到一个TabHost的实例,然后就可以给这个TabHost添加Tab了.示例代码如下: [java] view plaincopy public class PlotHost extends TabActivity  { @Override protected void onCre

Java创建Timestamp的几种方式

1.java创建Timestamp的几种方式 Timestamp time1 = new Timestamp(System.currentTimeMillis()); Timestamp time2 = new Timestamp(new Date().getTime()); Timestamp time3 = new Timestamp(Calendar.getInstance().getTimeInMillis()); //不建议使用 Timestamp time4 = new Timest

创建线程的两种方式比较Thread VS Runnable

1.首先来说说创建线程的两种方式 一种方式是继承Thread类,并重写run()方法 1 public class MyThread extends Thread{ 2 @Override 3 public void run() { 4 // TODO Auto-generated method stub 5 6 } 7 } 8 //线程使用 9 MyThread mt = new MyThread(); //创建线程 10 mt.start(); //启动线程 另外一种方式是实现Runnabl