UIWindow

# UIWindow

UIwindow在官方文档中是继承自UIView的. 但是,在实际显示上,是绝对的首席"view".


UIWindow_第1张图片

*通常在一个app中只会有一个UIWindow

ios程序启动完毕后,创建的第一个视图控件就是UIwindow,接着创建控制器的view,然后再将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了.

*一个程序之所以能显示在屏幕上,完全是因为有UIWin,也就是说, 没有UIwindow就看不到UI界面.

先创建UIWindow,再创建控制器,创建控制器的view,然后再将view添加在UIWindow上.

# UIWindow的创建过程

* 当程序启动进入UIApplicationMain函数后,会根据第三个参数创  建一个UIapplication对象,随后第四个对象创建一个它的代理,进入事件循环.

* 进入到代理的 didFinishLaunching方法

-  两种将view添加到uiview的方法

-  1. 创建一个控制器,直接addsubviews方法将view添加到UIwin上,成为它的子控件

- 2 . 创建一个控制器,通过

- ```objc

self.window.addRootController = vc```添加

UIWindow_第2张图片
UIWindow_第3张图片
![](/Users/ws/Desktop/

两个方法的区别:

以后的开发中,建议使用(2).因为方法(1)存在一些问题,比如说控制器上面可能由按钮,需要监听按钮的点击事件,如果是1,那么按钮的事件应该由控制器来进行管理。但控制器是一个局部变量,控制器此时已经不存在了,但是控制器的view还在,此时有可能会报错。注意:方法执行完,这个控制器就已经不存在了。

问题描述1:当view发生一些事件的时候,通知控制器,但是控制器已经销毁了,所以可能出现未知的错误。

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

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

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


# 在storyboard中UIWindow是怎样创建的

***为什么创建一个storyboard,没有看到创建uiwindow的过程?

**

UIWindow的创建过程被屏蔽起来,通过在Appdelegate中打印可获得UIWindow的地址,通知也获得了一个控制器的地址,默认成它的root控制器


# 如何获取window

```objc

[self.window makekeyadndvisible];

```

UIWindowLevelAlert >UIWindowLevelStatus>UIWindowLevelnomal

键盘的弹出

你可能感兴趣的:(UIWindow)