UIWindow的作用

UIWindow主要有两个作用:

1 作为UIView视图的最顶层容器,包含所有要显示的UIView

2 传递触摸,非触摸,键盘事件,其中传递非触摸和键盘事件时,UIWindow必须是keyWindow(经过实验,传递触摸事件时不需要UIWindow是keyWindow,但是必须可见)

创建UIWindow

创建UIView的时候,需要使用addSubview将新创建的View添加到视图层次当中,而创建UIWindow的时候不用这样做,因为UIWindow就是视图的最顶层容器,只要直接设置其hidden = NO,或者调用makeKeyAndVisible就可以显示了。新创建的window都会被加入到UIApplication的windows属性中,windows是一个数组,整个数组整体上按照windowLevel由低到高排序,即第0个window的windowLevel肯定最低,最后一个window的windowLevel最高,如果有两个window的windowLevel相同,那么它们的顺序是不确定的(此时,不一定就是按照创建的先后顺序排)

UIWindow的rootViewController属性

1 在为UIWindow添加子视图的时候,除了使用addSubview添加,还可以设置window的rootViewController属性。设置rootViewController之后,rootViewController上的view自动被加入到window当中,并且如果设置rootViewController时window原来就有子视图,那么这些子视图会先被移除掉。

2 如果你在(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法返回之前创建了一个window,那么就必须为其设置rootViewController属性,否则会报"Application windows are expected to have a root view controller at the end of application launch"的错误。

特别的,如果你在(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中创建了一个window1并且设置了rootViewController1,然后在这个rootViewController1的viewDidLoad中又创建了一个window2,但是没有为其设置rootViewController属性,程序运行的时候就会报上述错误,原因就是调用rootViewController1的viewDidLoad的时候,(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法还没有返回。

实际上,不管是把创建window2的代码加到rootViewController1的loadView还是viewWillAppear中都会出现这个问题,因为(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions在viewWillAppear调用之后才会继续运行。解决上面问题方法就是可以把创建window2的代码放在viewDidAppear中,此时- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法已经运行结束了。

UIWindow的windowLevel

windowLevel越大,在视觉上window就越靠前,低windowLevel的window不会遮挡高windowLevel的window。如果两个window的windowLevel一样,那么它们的顺序不确定(并不一定按照创建的先后顺序),如果想要把同一级的某个window放到和它同级window的最前面,调用makeKeyAndVisible即可(调用makeKeyWindow不会起到这个效果)

iOS中的UIWindow的更多相关文章

  1. iOS 中的UIWindow

    使用Xcode新建一个工程后,Xcode会自动新建一些文件,其中有AppDelegate.h,AppDelegate.m,ViewController.h,ViewController.m,Main. ...

  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. Nginx源码研究一:NGINX模块启动

    Nginx 是一个轻量级,但是高性能的 HTTP 和 代理 服务器,也是一个 IMAP/POP3/SMTP代理服务器. 它的第一个版本0.1.0是由俄罗斯的工程师Igor Sysoev与2004年10 ...

  2. Linux系统下快速删除某个目录下大量文件

    不管是哪个操作系统,同一级目录存在太多的文件都是一件可怕的事情,不管是读取还是删除的时候. 一旦这种不幸的事情发生在你身上,而又不能完全把整个目录删掉怎么办呢? 你可以用 rm -f *.log 但是 ...

  3. gtk程序如何进行编译

    程序名: gtk_example.c    生成目标文件:gtk_example gcc gtk_example.c -o gtk_example   `pkg-config --libs --cfl ...

  4. 统计建模与R软件习题二答案

    # 习题2 # 2.1 x=c(1,2,3) y=c(4,5,6) e=c(rep(1,3)) z=2*x+y+e;z x%*%y # 若x,y如答案那样定义为矩阵,则不能用%*%,因为,维数不对应, ...

  5. DDMS中File Explorer无法查看data/data文件解决办法

    http://www.cnblogs.com/smyhvae/p/3881477.html  找了个连接 问题描述:最近在学习Android SQLite中的SQLiteOpenHelper,使用SQ ...

  6. noi 04:网线主管

    04:网线主管 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 仙境的居民们决定举办一场程序设计区域赛.裁判委员会完全由自愿组成,他们承诺要组织一次史上最公正 ...

  7. Java比较两个日期的大小

    public static String getComparedSBQDate(String yxqq,String starttime){ String str = starttime; Simpl ...

  8. 安卓各文件存储路径汇总(Android file path)

    写下来,省得以后不记得到处翻: Environment.getDataDirectory() = /data Environment.getDownloadCacheDirectory() = /ca ...

  9. UNIQUE NullAble

    一般情况 UNIQUE 不应该出现nullable的 但是如果我们要支持也是有办法的,就是写一个filter. https://msdn.microsoft.com/en-us/library/ms1 ...

  10. hdu 1543 Paint the Wall

    http://acm.hdu.edu.cn/showproblem.php?pid=1543 #include <cstdio> #include <cstring> #inc ...