iOS 中的UIWindow
使用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的更多相关文章
- iOS中的UIWindow
UIWindow的作用 UIWindow主要有两个作用: 1 作为UIView视图的最顶层容器,包含所有要显示的UIView 2 传递触摸,非触摸,键盘事件,其中传递非触摸和键盘事件时,UIWindo ...
- iOS中事件传递过程
iOS中,UIApplication管理着一个事件的队列,当系统获取用户的点击或滑动等事件后,就会将这些事件按顺序插入UIApplication管理的这个队里中,UIApplication再从这个队列 ...
- iOS中响应者链条-触摸事件
总体来说,分2个步骤: 一,从上到下寻找合适的控件来处理这个触摸事件.如下图,如果点击了黄色4,则UIApplication -> UIWindow -> 1白色 -> 2橙色 -& ...
- iOS中的事件传递和响应者链条
本文转自:http://www.linuxidc.com/Linux/2015-08/121270.htm 首先我们来看看ios中事件的产生和传递过程 1.发生触摸事件后,系统会将事件加入到一个由UI ...
- iOS中的触摸事件和手势处理
iOS中的事件可以分为三大类: 1> 触摸事件 2> 加速计事件 3> 远程控制事件 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并 ...
- ios中的事件处理、响应者链条以及第一响应者
在ios中,事件UIEvent类来表示,当一个事件发生时,系统会搜集的相关事件信息,创建一个UIEvent对象,最后将该事件转发给应用程序对象(UIApplication).日常生活中,主要有三种类型 ...
- iOS中—触摸事件详解及使用
iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...
- 说说iOS中的手势及触摸
一.响应链 在IOS开发中会遇到各种操作事件,通过程序可以对这些事件做出响应. 首先,当发生事件响应时,必须知道由谁来响应事件.在IOS中,由响应者链来对事件进行响应,所有事件响应的类都是UIResp ...
- iOS中多控制器的使用
通常情况下,一个app由多个控制器组成,当app中有多个控制器的时候,我们就需要对这些控制器进行管理. 在开发过程中,当有多个View时,可以用一个大的view去管理多个小的view,控制器也是如此, ...
随机推荐
- 【转】Android 如何在Eclipse中查看Android API源码 及 support包源码
原文网址:http://blog.csdn.net/vipzjyno1/article/details/22954775 当我们阅读android API开发文档时候,上面的每个类,以及类的各个方法都 ...
- ecshop init.php文件分析
1. ecshop init.php文件分析 2. <?php 3. 4. /** 5. * ECSHOP 前台公用文件 6. * ===================== ...
- 音频PCM格式
经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等. 44100HZ 16bit stereo: 每秒钟有 44100 次采样, 采样数据用 ...
- hdu 5407 CRB and Candies(组合数+最小公倍数+素数表+逆元)2015 Multi-University Training Contest 10
题意: 输入n,求c(n,0)到c(n,n)的所有组合数的最小公倍数. 输入: 首行输入整数t,表示共有t组测试样例. 每组测试样例包含一个正整数n(1<=n<=1e6). 输出: 输出结 ...
- 1048 图的宽度优先遍历序列 c语言
描述 图(graph)是数据结构 G=(V,E),其中V是G中结点的有限非空集合,结点的偶对称为边(edge):E是G中边的有限集合.设V={0,1,2,……,n-1},图中的结点又称为顶点(vert ...
- MyBatis批量删除 多态sql,构建in语句
<!--==========================删除==================================== --> <delete id=&quo ...
- replace() MySQL批量替换指定字段字符串
mysql replace实例说明: UPDATE tb1 SET f1=REPLACE(f1, 'abc', 'def'); REPLACE(str,from_str,to_str) 在字符串 st ...
- webdriver(python)学习笔记四——定位一组元素
webdriver可以很方便的使用find_element方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用find_elements方法. 定位一组对象一般用于以下场景: ...
- The Tower of Babylon
题意: 有n个,长x宽y高z的长方体,把这些长方体摞起来,上面长方体底面的长宽一定要小于下面的,求能摞的最大高度. 分析: 一个长方体,可以有三种放法,先把所有放的状态存起来,按底面升序排列,dp[i ...
- codeforces 696A Lorenzo Von Matterhorn 水题
这题一眼看就是水题,map随便计 然后我之所以发这个题解,是因为我用了log2()这个函数判断在哪一层 我只能说我真是太傻逼了,这个函数以前听人说有精度问题,还慢,为了图快用的,没想到被坑惨了,以后尽 ...