在程序的启动过程中提到如果没有storyboard时:
     * 程序启动时候, 就会调用代理的application:  didFinishLaunchingWithOptions:方法
     * 在application: didFinishLaunchingWithOptions:中创建UIWindow
     * 创建和设置UIWindow的rootViewController
     * 显示窗口
也就是说:程序启动,先加载UIWindow,UIWindow将作为容器去接收的控件;
那么UIWindow是什么?
     UIwindow是一个特殊的UIView,在一个app只能有一个UIWindow是keyWindow;
     iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建UIViewController的view,最后将UIViewController的view添加到UIWindow上,于是UIViewController的view就显示在屏幕上了;
     一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow。
          ps:UIViewController的属性
        @property(null_resettable,nonatomic,strong)UIView*view;
看一张图片:
 UIwindow的常见方法:
     - (void)makeKeyWindow;
          让当前UIWindow变成keyWindow(主窗口)
     - (void)makeKeyAndVisible;
          让当前UIWindow变成keyWindow,并显示出来
          添加UIView到UIWindow中
     - (void)addSubview:(UIView*)view;
          直接将view添加到UIWindow中,但并不会理会view对应的UIViewController
     @property(nonatomic,retain)UIViewController*rootViewController;
          自动将rootViewController的view添加到UIWindow中,负责管理rootViewController的生命周期
 
    总结:在没有storyboard时,首先需要创建UIWindow,再创建UIViewController;
UIViewController的创建方式一:代码创建
创建一个类YSCViewController继承自ViewController,将头文件(#import“YSCViewController.h”)导入
AppDelegate.m

代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//实例化window
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; //创建控制器并使之成为root控制器
YSCViewController *vc = [[YSCViewController alloc] init];
self.window.rootViewController = vc; //设置window为主window和可见
[self.window makeKeyAndVisible];
return YES;
}

UIViewController的创建方式二:Xib方式

1.指定xib的名称:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//实例化window
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; //创建控制器并使之成为root控制器
YSCViewController *vc = [[YSCViewController alloc] initWithNibName:@"YSCViewController" bundle:nil];
self.window.rootViewController = vc; //设置window为主window和可见
[self.window makeKeyAndVisible];
return YES;
}

2.不指定xib的名称时:在Xcode7.1中,默认优先与UIViewController类同名的Xib(即YSCViewController),如果同名的不存在,再去调用去掉Controller的Xib(即YSCView);

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//实例化window
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; //创建控制器并使之成为root控制器
YSCViewController *vc = [[YSCViewController alloc] init];
self.window.rootViewController = vc; //设置window为主window和可见
[self.window makeKeyAndVisible];
return YES;
}

用xib创建时的注意点:(如果创建类时,同时创建Xib则无需关注)

 把该view连线设为主文件
UIViewController的创建方式三:storyboard方式
创建YSCStoryboard.storyboard,并创建两个UIViewController,并将在storyboard
里面Class 要指向要对应的
UIViewController,我使用工程中已经存在的类默认的ViewController
1.通过初始化“初始控制器”(storyboard中箭头所指的控制器)来导入
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//实例化window
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; //导入加载storyboard并使之成为root控制器
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"YSCStoryboard" bundle:nil];
ViewController *vc = sb.instantiateInitialViewController;
self.window.rootViewController = vc; //设置window为主window和可见
[self.window makeKeyAndVisible];
return YES;
}

2.通过一个标识初始化对应的控制器来导入

    //导入加载storyboard并使之成为root控制器
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"YSCStoryboard" bundle:nil];
ViewController *vc = [sb instantiateViewControllerWithIdentifier:@"edit"];
self.window.rootViewController = vc;

iOS-UIViewController创建的几种方法和UIWindow的介绍的更多相关文章

  1. python中统计计数的几种方法和Counter的介绍

    使用字典dict()alist=['a','b','a','c','b','b',1,3]count_dict = dict()for i in alist:count_dict[i]=count_d ...

  2. 杨柳絮-Info:对抗杨柳絮的7种方法和2种防治手段

    ylbtech-杨柳絮-Info:对抗杨柳絮的7种方法和2种防治手段 园林养护人员在对抗杨柳絮上 主要有以下两种方法↓↓ 1.化学方法 化学方法是通过激素等调节剂来抑制植物发芽分化,达到减少杨柳开花的 ...

  3. 李洪强iOS开发之OC语言description方法和sel

    OC语言description方法和sel 一.description方法 Description方法包括类方法和对象方法.(NSObject类所包含) (一)基本知识 -description(对象 ...

  4. File类创建删除功能的方法和File类遍历(文件夹)目录功能

    File类创建删除功能的方法 -public boolean createNewFile():当且仅当具有该名称的文件尚不存在时,创建一个新的空文件 -public boolean delete(): ...

  5. ps怎么撤销的三种方法和ps撤销快捷键以及连续撤销多步快捷键

    内容提要:文章综合介绍ps撤销快捷键相关的一些操作,包括PS怎么撤销.PS撤销多步.ps连续撤销快捷键.历史记录面板操作等等. 关于ps怎么撤销操作,有多种方法:使用PS撤销快捷键.编辑菜单.文件菜单 ...

  6. js继承的几种方法和es6继承方法

        一.原型链继     1.基本思想     利用原型链来实现继承,超类的一个实例作为子类的原型     2.具体实现     function F() {}     //原型属性,原型方法: ...

  7. (转)AIX修改系统时区的3种方法和AIX 时间问题(夏令时)

    原文:http://blog.csdn.net/fuwencaho/article/details/28267283 http://www.wo81.com/tec/os/aix/2014-04-30 ...

  8. File类创建删除功能的方法和File类遍历目录功能

    File类创建删除功能的方法 public boolean createNewFile();当且仅当具有该名称的文件尚不存在的时候,创建一个新的空文件 public boolean delete(); ...

  9. JavaScript -- Array中的push()方法和concat()方法介绍

    Array => push()方法向数组的末尾添加一个或者多个元素,也就是说它会改变数组本身 concat() => concat()方法用于连接2个或者多个数组,但它的特殊之处在于,它会 ...

随机推荐

  1. webpack的proxytable的配置

    这个一定不能忘记了/rest/后面的/,否则就是404找不到接口 这样的实现效果是 this.axios.post('/api/delShare', qs.stringify({'Id':Number ...

  2. Linux相关命令、虚拟机网络配置

    虚拟机联网 Linux命令 1.查找 #查找django进程,不包括grep自建的 ps -ef |grep django | grep -v grep # find 查找home目录下的name.t ...

  3. Docker镜像下载及加速器设置

    docker远程仓库配置: vim ~/.docker/daemon.json { "registry-mirrors" : [ "https://registry.do ...

  4. DPDK IP分片及重组库(学习笔记)

    1 前置知识学习 1.1 MTU MTU是最大传输单元( Maximum Transmission Unit)的缩写,指一个接口无需分片所能发送的数据包的最大字节数.  MTU范围在46 ~ 1500 ...

  5. 通俗易懂描述dubbo工作原理

    关于dubbo的描述就不再赘述,直接进入主题,那就是dubbo的工作原理.dubbo分为服务提供者和服务消费者,主要的工作内容有以下几点:提供者暴露服务.消费者引入服务.提供者和消费者和注册中心之间的 ...

  6. LightOJ1336

    题目大意: 给你一个 n ,求出 1 到 n 中有多少个数的因数和为偶数. 解题思路: 可以先求出因数和为奇数的数字的个数. 由算术基本定理我们可以得到:N=P1a1P2a2P3a3 … Pnan, ...

  7. tomcat启动失败怎么回事?

    1.系统环境没有配置好 2.web.xml文件里有错误拼写

  8. vim的基础命令

    :q 退出 :wq 保存并退出 :q! 不保存并退出 :w 保存 :w! 强行保存

  9. thinkphp路由简介和设置使用

    use think\Route; //静态路由 Route::rule('/', 'index/index/index'); Route::rule('test', 'index/index/test ...

  10. MySQL浮点数和定点数

    MySQL 分为两种方式:浮点数和定点数.浮点数包括 float(单精度)和 double(双精度),而定点数则只有 decimal 一种表示.定点数在 MySQL 内部以字符串形式存放,比浮点数更精 ...