zoukankan      html  css  js  c++  java
  • 1.2 控制器 view 的创建和加载

    本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末
    如果觉得本文内容过长,请前往本人 “简书
     
     
     
    加载优先顺序:
    • 1、用系统的loadView方法创建控制器的视图
    • 2、如果指定加载某个storyboard文件做控制器的视图,就会加载storyboard里面的描述去创建view
    • 3、如果指定读取某个xib文件做控制器的视图,就根据指定的xib文件去加载创建
    • 4、如果有xib文件名和控制器的类名前缀(也就是去掉controller)的名字一样的 xib文件,就会用这个xib文件来创建控件器的视图 【例:控件器的名为 TDViewController, xib文件名为 TDView.xib】
    • 5、找和控制器同名的xib文件去创建
    • 6、如果以上都没有就创建一个空的控件器的视图;
     
     
     
    控制器view的延迟加载:
    • 控制器的view是延迟加载(懒加载)的:用到时再加载
    • 控制器的view加载完毕(先加载loadView),再去 调用viewDidLoad方法
    • 用isViewLoaded方法判断UIViewController的view是否已经被加载

    图解:

    代码验证:

     1 #import "AppDelegate.h"
     2 #import "TDViewController.h"
     3 
     4 @interface AppDelegate ()
     5 @end
     6 
     7 @implementation AppDelegate
     8 
     9 - (BOOL)application:(UIApplication *)application
    10     didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    11 
    12   // 创建window
    13   self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    14 
    15   // 1.没有同名xib情况下(不用sb 和 xib) alloc init
    16   // 结论:透明的view
    17   TDViewController *vc = [[TDViewController alloc] init];
    18 
    19   // 2.通过 storyboard 创建
    20   // 结论:View默认是白色(因为sb拖控制器的时候 就是白色),和指定sb的描述是一致的
    21   UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
    22   TDViewController *vc = [sb instantiateInitialViewController];
    23 
    24   // 3.有指定xib情况下创建
    25   // 结论:view和指定xib的描述是一致的
    26   TDViewController *vc =
    27       [[TDViewController alloc] initWithNibName:@"TD" bundle:nil];
    28 
    29   // 4.有同名xib情况
    30   // 结论:如果有同名的话,会有优先加载同名的 xib, 因此不需要 initWithNibName
    31       TDViewController* vc = [[TDViewController alloc] init];
    32 
    33   // 5.有同名去掉controller的情况
    34   // 结论:如果有同名去掉controller的情况,优先级 会比 同名高
    35   TDViewController *vc = [[TDViewController alloc] init];
    36 
    37   self.window.rootViewController = vc;// 设置跟控制器
    38   [self.window makeKeyAndVisible];// 显示
    39 
    40   return YES;
    41 }
     1 #import "TDViewController.h"
     2 
     3 @interface TDViewController ()
     4 @end
     5 
     6 @implementation TDViewController
     7 
     8 - (void)viewDidLoad {
     9   [super viewDidLoad];
    10 }
    11 
    12 - (void)didReceiveMemoryWarning {
    13   [super didReceiveMemoryWarning];
    14 }
    15 
    16 // 6.loadView 此方法用来重写vc的view
    17 // 结论:比其他(xib sb 代码)的优先级都要高
    18 - (void)loadView {
    19   self.view = [[UIView alloc] init];
    20   self.view.backgroundColor = [UIColor purpleColor];
    21   NSLog(@"loadView");
    22 }
    23 
    24 @end

    控制器view的加载

    loadView方法仅在用代码创建视图控制器的界面时使用
    在loadView方法中根据实际需求来确定到底是否需要调用[super loadView] 
     

     

    Screen & Window & View Controller的关系 
     
     
     
    内存警告处理
     
     
     
     
     
     
    如果你觉得本篇文章对你有所帮助,请点击右下部“推荐”,^_^
     
     
    作者:蓝田(Loto)
    出处:http://www.cnblogs.com/shorfng/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
     

    如有疑问,请发送邮件至 shorfng@126.com 联系我。
     
    By:蓝田(Loto)
     
     
     
     
     
  • 相关阅读:
    docker-compose 命令不存在
    linux安装rabbitmq ssm集成rabbitmq
    tomcat参数错误 服务器400
    无限极分内 自联查询
    图片移入变大 点击图片切换 点击按钮显示图片
    js正则表达式基本书写
    随鼠标移动
    输入电话号码
    添加新句子
    窗口的弹出与关闭
  • 原文地址:https://www.cnblogs.com/shorfng/p/5149910.html
Copyright © 2011-2022 走看看