UIWindow
简单介绍
UIWindow是一种特殊的
UIView
,通常在一个app中只会有一个UIWindow
iOS程序启动完毕后, 创建的第一个视图控件就是
UIWindow
;接着创建控制器的view,
最后
将控制器的view添加到UIWindow
上,于是控制器的view
就显示在屏幕上了.一个iOS程序之所以能显示到屏幕上,
完全是因为
它有UIWindow。也就说,没有UIWindow
,就看不见任何UI
界面
补充:UIWindow是创建的第一个视图控件(创建的第一个对象是UIapplication)
创建视图
添加视图到 UIWindow
先创建 UIWindow 再创建控制器,创建控制器的 view ,最后将控制器的 view 添加到UIWindow 上
二 UIWindow 的创建过程
1.简单说明
创建一个空项目就能看到 UIWindow 怎么出来的了
注意:
程序启动后,先创建 application 再创建代理 ,之后创建 UIWindow(继承至 UIView)
2.把 view 添加到 UIWindow 上面;
创建控制器,将 UIView 添加到 UIWindow (两种方式)
方法1: 创建一个控制器,直接将控制器的 view 添加到 UIWindow 上面(不理会它对应的控制器)
1
[self.window addsubView:vc.view];
方法2: 设置 UIWindow 的根控制器,rootViewController的 view 会自动加入到 window 中. (
没有UIWindow,就看不见任何UI界面
) 负责管理 UIWindow 的生命周期
两个方法的区别:以后开发中,使用2,因为1存在一些问题,比如说控制器上可能有按钮,需要监听按钮的点击事件,如果是1,那么按钮的事件应该由控制器来进行管理.但是
控制器是一个局部变量
,此时控制器已经不存在了,但是控制器的 view 还在,有可能会报错.注意: 方法执行完,这个控制器就已经不存在了.
1 | 问题描述1:当view发生一些事件的时候,通知控制器,但是控制器已经销毁了,所以可能出现未知的错误。 |
资料: 事件传递 ,响应者链条
响应者链的事件传递过程:
- 如果当前view是控制器的view,那么控制器就是上一个响应者(
即是:下面该谁响应这个事件
),事件就传递给控制器;如果当前view不是控制器的view,那么父视图就是当前view的上一个响应者,事件就传递给它的父视图
- 在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理
- 如果window对象也不处理,则其将事件或消息传递给UIApplication对象
- 如果UIApplication也不能处理该事件或消息,则将其丢弃
总结:
事件的传递与响应:
- 当一个
事件发生
后,事件会从父控件传给子控件
,也就是说由UIApplication -> UIWindow -> UIView -> initial view,以上就是事件的传递。 - 接下来是事件的响应。
首先看
initial view能否处理这个事件,如果不能
则会将事件传递
给其上级视图
(inital view的superView);如果上级视图仍然无法处理则会继续往上传递;一直传递到视图控制器view controller
,首先
判断视图控制器的根视图view是否能处理此事件;如果不能
则接着判断该视图控制器能否处理此事件,如果还是不能则继续向上传 递
;(对于第二个图视图控制器本身还在另一个视图控制器中,则继续交给父视图控制器的根视图,如果根视图不能处理则交给父视图控制器处理
);一直到 window
,如果window还是不能处理此事件则继续交给application处理,如果最后
application还是不能处理此事件则将其丢弃 - 在事件的
响应
中,如果某个控件实现了touches
…方法,则这个事件将由该控件来接受
,如果调用了[supertouches….];就会将事件顺着响应者链条往上传递,传递给上一个响应者;接着就会调用上一个响应者的touches….方法