# UIWindow
UIwindow在官方文檔中是繼承自UIView的. 但是,在實際顯示上,是絕對的首席"view".
*通常在一個app中只會有一個UIWindow
ios程序啟動完畢后,創(chuàng)建的第一個視圖控件就是UIwindow,接著創(chuàng)建控制器的view,然后再將控制器的view添加到UIWindow上,于是控制器的view就顯示在屏幕上了.
*一個程序之所以能顯示在屏幕上,完全是因為有UIWin,也就是說, 沒有UIwindow就看不到UI界面.
先創(chuàng)建UIWindow,再創(chuàng)建控制器,創(chuàng)建控制器的view,然后再將view添加在UIWindow上.
# UIWindow的創(chuàng)建過程
* 當程序啟動進入UIApplicationMain函數(shù)后,會根據(jù)第三個參數(shù)創(chuàng)? 建一個UIapplication對象,隨后第四個對象創(chuàng)建一個它的代理,進入事件循環(huán).
* 進入到代理的 didFinishLaunching方法
-? 兩種將view添加到uiview的方法
-? 1. 創(chuàng)建一個控制器,直接addsubviews方法將view添加到UIwin上,成為它的子控件
- 2 . 創(chuàng)建一個控制器,通過
- ```objc
self.window.addRootController = vc```添加
兩個方法的區(qū)別:
以后的開發(fā)中攻旦,建議使用(2).因為方法(1)存在一些問題,比如說控制器上面可能由按鈕,需要監(jiān)聽按鈕的點擊事件,如果是1,那么按鈕的事件應該由控制器來進行管理跑芳。但控制器是一個局部變量,控制器此時已經(jīng)不存在了,但是控制器的view還在三热,此時有可能會報錯。注意:方法執(zhí)行完三幻,這個控制器就已經(jīng)不存在了就漾。
問題描述1:當view發(fā)生一些事件的時候,通知控制器念搬,但是控制器已經(jīng)銷毀了抑堡,所以可能出現(xiàn)未知的錯誤。
問題描述2:添加一個開關按鈕朗徊,讓屏幕360度旋轉(兩者的效果不一樣)首妖。當發(fā)生屏幕旋轉事件的時候,UIapplication對象會將旋轉事件傳遞給uiwindow,uiwindow又會將旋轉事件傳遞給它的根控制器爷恳,由根控制器決定是否需要旋轉
UIapplication->uiwindow->根控制器(第一種方式?jīng)]有根控制器有缆,所以不能跟著旋轉)。
####提示:不通過控制器的view也可以做開發(fā),但是在實際開發(fā)中棚壁,不要這么做杯矩,不要直接把view添加到UIWindow上面去。因為灌曙,難以管理菊碟。
# 在storyboard中UIWindow是怎樣創(chuàng)建的
***為什么創(chuàng)建一個storyboard,沒有看到創(chuàng)建uiwindow的過程在刺?
**
UIWindow的創(chuàng)建過程被屏蔽起來,通過在Appdelegate中打印可獲得UIWindow的地址,通知也獲得了一個控制器的地址,默認成它的root控制器
# 如何獲取window
```objc
[self.window makekeyadndvisible];
```
UIWindowLevelAlert >UIWindowLevelStatus>UIWindowLevelnomal
鍵盤的彈出