使用Xcode新建一个工程后,Xcode会自动新建一些文件,其中有AppDelegate.h,AppDelegate.m,ViewController.h,ViewController.m,Main.storyboard。AppDelegate.h中有一个对象是UIWindow,代码如下:

@property (strong, nonatomic) UIWindow *window;

那么,这个window的作用是什么呢?

实际上,一个app之所以能够显示在屏幕上,就是因为有该UIWindow对象。只有UIWindow能够主动显示,其他的view可以添加到UIWindow上,这样,其他的view也得以显示在屏幕上。

虽然在Xcode7中已经不能新建一个没有storyboard的工程,但是我们可以通过修改程序的Main Interface来测试UIWindow。方法如下:

点击工程->General,将Main Interface 改为空。如下图:

这时候再运行程序,会发现整个屏幕黑屏,如下图:

黑屏的原因就是因为没有实现UIWindow。

现在,手动实现下UIWindow。

在AppDelegate.m中添加window的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}

此时运行程序会发现有错误,错误提示如下:

'NSInternalInconsistencyException', reason: 'Application windows are expected to have a root view controller at the end of application launch'

提示没有rootViewController。也就是说,需要设置UIWindow对象的rootViewController。

设置UIWindow的rootViewController代码如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible]; // 设置rootViewController
ViewController *controller = [[ViewController alloc] init];
self.window.rootViewController = controller; return YES;
}

运行程序,会看到和没有修改Main Interface 之前是一样的。

我们知道,在app程序启动后,会立刻调用

(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
方法,在该方法中可以设置 UIWindow和UIWindow 的 rootViewController。这样,整个app就显示在屏幕上。

在Xcode中新建工程时,通常情况下会包含 storyboard 文件,此时是不需要在上面的方法中设置 UIWindow的。那么,在有storyboard文件的情况下,是如何设置UIWindow的呢?

实际上,程序在加载主要storyboard的时候(也就是Main Interface 指向的storyboard),就会设置UIWindow和UIWindow的rootViewController。

总结下一个app程序的启动过程:

1: 调用 main 方法

2:调用 UIApplicationMain方法,在该方法中会做下面两件事:

(1)创建UIApplication对象

(2)创建UIApplication的delegate对象

3.1 在没有storyboard的情况下,delegate对象开始监听系统事件:

  (1)程序启动完毕的时候,就会调用 application:didFinishLaunchingWithOptions 方法

  (2)在 application:didFinishLaunchingWithOptions 方法中创建UIWindow

  (3)创建和设置UIWindow的rootViewController

  (4)显示创库

3.2 在有storyboard的情况下,根据Info.plist获得最主要的storyboard的文件名,加载最主要的storyboard:

  (1)创建UIWindow

  (2)创建和设置UIWindow的rootViewController

  (3)显示窗口

												

iOS 中的UIWindow的更多相关文章

  1. iOS中的UIWindow

    UIWindow的作用 UIWindow主要有两个作用: 1 作为UIView视图的最顶层容器,包含所有要显示的UIView 2 传递触摸,非触摸,键盘事件,其中传递非触摸和键盘事件时,UIWindo ...

  2. iOS中事件传递过程

    iOS中,UIApplication管理着一个事件的队列,当系统获取用户的点击或滑动等事件后,就会将这些事件按顺序插入UIApplication管理的这个队里中,UIApplication再从这个队列 ...

  3. iOS中响应者链条-触摸事件

    总体来说,分2个步骤: 一,从上到下寻找合适的控件来处理这个触摸事件.如下图,如果点击了黄色4,则UIApplication -> UIWindow -> 1白色 -> 2橙色 -& ...

  4. iOS中的事件传递和响应者链条

    本文转自:http://www.linuxidc.com/Linux/2015-08/121270.htm 首先我们来看看ios中事件的产生和传递过程 1.发生触摸事件后,系统会将事件加入到一个由UI ...

  5. iOS中的触摸事件和手势处理

    iOS中的事件可以分为三大类: 1> 触摸事件 2> 加速计事件 3> 远程控制事件 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并 ...

  6. ios中的事件处理、响应者链条以及第一响应者

    在ios中,事件UIEvent类来表示,当一个事件发生时,系统会搜集的相关事件信息,创建一个UIEvent对象,最后将该事件转发给应用程序对象(UIApplication).日常生活中,主要有三种类型 ...

  7. iOS中—触摸事件详解及使用

    iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...

  8. 说说iOS中的手势及触摸

    一.响应链 在IOS开发中会遇到各种操作事件,通过程序可以对这些事件做出响应. 首先,当发生事件响应时,必须知道由谁来响应事件.在IOS中,由响应者链来对事件进行响应,所有事件响应的类都是UIResp ...

  9. iOS中多控制器的使用

    通常情况下,一个app由多个控制器组成,当app中有多个控制器的时候,我们就需要对这些控制器进行管理. 在开发过程中,当有多个View时,可以用一个大的view去管理多个小的view,控制器也是如此, ...

随机推荐

  1. SQL查看数据库所用用户表数量和使用的空间

    SQL Server数据库管理员通常硬盘空间奋斗,不断努力清理“表”,撰写许多查询,发现该表使用的硬盘空间. 本文介绍了如何查询系统表的空间使用情况,帮助数据库管理员识别正在使用最多的空间,以便存档旧 ...

  2. UVa 11235 (RMQ) Frequent values

    范围最值问题,O(nlogn)的预处理,O(1)的查询. 这个题就是先对这些数列进行游程编码,重复的元素只记录下重复的次数. 对于所查询的[L, R]如果它完全覆盖了某些连续的重复片段,那么查询的就是 ...

  3. I.MX6 Android netperf

    /***************************************************************************** * I.MX6 Android netpe ...

  4. HDU 3749 Financial Crisis 经济危机(点双连通分量)

    题意: 给一个图n个点m条边(不一定连通),接下来又q个询问,询问两个点是为“不相连”,“仅有一条路径可达”,“有两条及以上的不同路径可达”三种情况中的哪一种.注:两条以上的路径指的是路径上的点连1个 ...

  5. 最简单的视音频播放示例7:SDL2播放RGB/YUV

    本文记录SDL播放视频的技术.在这里使用的版本是SDL2.实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API.在Windows平台下,SDL封装了Direct3D这类的API ...

  6. 四、oracle基本sql语句和函数详解

    一.oracle常用数据类型 一.  数据定义语言(ddl) 数据定义语言ddl(data definition language)用于改变数据库结构,包括创建.更改和删除数据库对象. 用于操纵表结构 ...

  7. 回调函数的应用误区4(c/s OK版本回调小程序)

    VC++深入详解里面说得也挺好:回调函数的实现机制: 1)定义一个回调函数 2)“函数实现者”(回调函数所在的模块)在初始化的时候,将回调函数的函数指针注册给“调用者”. 3)当特定的事件或条件发生的 ...

  8. [Papers]NSE, $\n u_3$, Lebesgue space, [Pokorny, EJDE, 2003; Zhou, MAA, 2002]

    $$\bex \n u_3\in L^p(0,T;L^q(\bbR^3)),\quad \frac{2}{p}+\frac{3}{q}=\frac{3}{2},\quad 2\leq q\leq \i ...

  9. 【原创】用python实现shell的tail操作

    在工作过程中发现监控实时刷新文件时,不是那么的任性. 故结合shell中的tail,做了一个类似tail的python脚本. 详情如下: #!/usr/bin/env python #coding=u ...

  10. HDU5794 A Simple Chess 容斥+lucas

    分析:转自http://blog.csdn.net/mengzhengnan/article/details/47031777 一点感想:其实这个题应该是可以想到的,但是赛场上并不会 dp[i]的定义 ...