zoukankan      html  css  js  c++  java
  • 创建控制器的3种方式、深入了解view的创建和加载顺序

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

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

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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.       
    11.     //第1种:直接alloc和init创建控制器  
    12.       
    13.     //第2种:通过storyboard的instantiateInitialViewController或instantiateViewControllerWithIdentifier创建  
    14.     //因为我们设置了main Storyboard,所以系统自动生成了如下代码  
    15.     UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];  
    16.     self.window.rootViewController=[storyboard instantiateInitialViewController];  
    17.       
    18.     //如果我们自己创建一个storyboard,则加载时用  
    19.     UIStoryboard *two=[UIStoryboard storyboardWithName:@"two" bundle:nil];  
    20.     self.window.rootViewController=[two instantiateInitialViewController];  
    21.       
    22.     //而如果two文件里有两个控制器,那么加载哪个就取决于storynoard ID  
    23.     UIStoryboard *three=[UIStoryboard storyboardWithName:@"two" bundle:nil];  
    24.     self.window.rootViewController=[three instantiateViewControllerWithIdentifier:@"hello"];  
    25.       
    26.     //第3种:创建控制器的时候给它传入一个xib文件作为view  
    27.     //需先创建一个xib文件出来,然后把这个xib文件的file's owner改为这个视图控制器,并把该视图控制器的试图连接到创建的视图,这样下面的代码才有用  
    28.     //注意,在xib文件中创建视图时不要错误地创建一个控制器  
    29.     OneViewController *oneVc=[[OneViewController alloc]initWithNibName:@"OneXib" bundle:nil];  
    30.     self.window.rootViewController=oneVc;  
    31.       
    32.     // Override point for customization after application launch.  
    33.     return YES;  
    34. }  


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

    (2)view的创建过程

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

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

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

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

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

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

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    1. -(void)loadView{  
    2.     self.view.backgroundColor=[UIColor greenColor];  
    3. }  


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

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

  • 相关阅读:
    使用css的类名交集复合选择器 《转》
    在Web.config或App.config中的添加自定义配置 <转>
    [转]给ListView加上ComboBox或是TextBox控件
    WinForm Timer控件,三级联动[省,市,区]
    WinForm用户窗体
    WinForm 进程 ,线程
    WinForm MDI窗体容器
    WinForm 控件TabelControl对TabelPage页的添加,删除操作
    [转]C#重绘TabControl的Tabpage标签,添加图片及关闭按钮
    WinForm sender初级应用
  • 原文地址:https://www.cnblogs.com/Jenaral/p/5027453.html
Copyright © 2011-2022 走看看