扬庆の博客

UIWindow

字数统计: 1.2k阅读时长: 4 min
2021/03/18 Share

UIWindow

简单介绍

  • UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow

  • iOS程序启动完毕后, 创建的第一个视图控件就是UIWindow ;

    接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了.

  • 一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow。也就说,没有UIWindow,就看不见任何UI界面

补充:UIWindow是创建的第一个视图控件(创建的第一个对象是UIapplication)


创建视图

创建视图

添加视图到 UIWindow

添加视图到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
2
3
4
5
6
7
问题描述1:当view发生一些事件的时候,通知控制器,但是控制器已经销毁了,所以可能出现未知的错误。

问题描述2:添加一个开关按钮,让屏幕360度旋转(两者的效果不一样)。当发生屏幕旋转事件的时候,UIapplication对象会将旋转事件传递给uiwindow,uiwindow又会将旋转事件传递给它的根控制器,由根控制器决定是否需要旋转

UIapplication->uiwindow->根控制器(第一种方式没有根控制器,所以不能跟着旋转)。

提示:不通过控制器的view也可以做开发,但是在实际开发中,不要这么做,不要直接把view添加到UIWindow上面去。因为,难以管理。

资料: 事件传递 ,响应者链条


事件传递事例

响应者链条

响应者链的事件传递过程:

  1. 如果当前view是控制器的view,那么控制器就是上一个响应者(即是:下面该谁响应这个事件),事件就传递给控制器;如果当前view不是控制器的view,那么父视图就是当前view的上一个响应者,事件就传递给它的父视图
  2. 在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理
  3. 如果window对象也不处理,则其将事件或消息传递给UIApplication对象
  4. 如果UIApplication也不能处理该事件或消息,则将其丢弃

总结:

事件的传递与响应:

  1. 当一个事件发生后,事件会从父控件传给子控件,也就是说由UIApplication -> UIWindow -> UIView -> initial view,以上就是事件的传递。
  2. 接下来是事件的响应。首先看initial view能否处理这个事件,如果不能则会将事件传递给其上级视图(inital view的superView);如果上级视图仍然无法处理则会继续往上传递;一直传递到视图控制器view controller首先判断视图控制器的根视图view是否能处理此事件;如果不能则接着判断该视图控制器能否处理此事件,如果还是不能则继续向上传 递;(对于第二个图视图控制器本身还在另一个视图控制器中,则继续交给父视图控制器的根视图,如果根视图不能处理则交给父视图控制器处理);一直到 window,如果window还是不能处理此事件则继续交给application处理,如果最后application还是不能处理此事件则将其丢弃
  3. 在事件的响应中,如果某个控件实现了touches…方法,则这个事件将由该控件来接受,如果调用了[supertouches….];就会将事件顺着响应者链条往上传递,传递给上一个响应者;接着就会调用上一个响应者的touches….方法

参考

CATALOG
  1. 1. UIWindow
    1. 1.0.1. 简单介绍
  2. 1.1. 二 UIWindow 的创建过程
    1. 1.1.0.1. 1.简单说明
    2. 1.1.0.2. 2.把 view 添加到 UIWindow 上面;
    3. 1.1.0.3. 响应者链的事件传递过程: