iOS開發(fā)UI篇—UIWindow簡單介紹
<h6> 一、簡單介紹
- UIWindow是一種
特殊的UIView,通常在一個(gè)app中只會(huì)有一個(gè)UIWindow -
iOS程序啟動(dòng)完畢后,創(chuàng)建的第一個(gè)視圖控件就是UIWindow,接著創(chuàng)建控制器的view,最后將控制器的view添加到UIWindow上,于是控制器的view就顯示在屏幕上了. - 一個(gè)iOS程序之所以能顯示到屏幕上,
完全是因?yàn)?/code>它有UIWindow。也就說,沒有UIWindow,就看不見任何UI界面
補(bǔ)充:UIWindow是創(chuàng)建的第一個(gè)視圖控件(創(chuàng)建的第一個(gè)對象是UIapplication)

添加:

先創(chuàng)建 UIWindow 再創(chuàng)建控制器,創(chuàng)建控制器的 view ,最后將控制器的 view 添加到UIWindow 上
二 UIWindow 的創(chuàng)建過程
1.簡單說明
創(chuàng)建一個(gè)空項(xiàng)目就能看到 UIWindow 怎么出來的了
注意:
程序啟動(dòng)后,先創(chuàng)建 application 再創(chuàng)建代理 ,之后創(chuàng)建 UIWindow(繼承至 UIView)
2.把 view 添加到 UIWindow 上面;
創(chuàng)建控制器,將 UIView 添加到 UIWindow (兩種方式)
- 方法1: 創(chuàng)建一個(gè)控制器,直接將控制器的 view 添加到 UIWindow 上面(不理會(huì)它對應(yīng)的控制器)
[self.window addsubView:vc.view];
- 方法2: 設(shè)置 UIWindow 的根控制器,rootViewController的 view 會(huì)自動(dòng)加入到 window 中. (
沒有UIWindow,就看不見任何UI界面) 負(fù)責(zé)管理 UIWindow 的生命周期
兩個(gè)方法的區(qū)別:以后開發(fā)中,使用2,因?yàn)?存在一些問題,比如說控制器上可能有按鈕,需要監(jiān)聽按鈕的點(diǎn)擊事件,如果是1,那么按鈕的事件應(yīng)該由控制器來進(jìn)行管理.但是
控制器是一個(gè)局部變量,此時(shí)控制器已經(jīng)不存在了,但是控制器的 view 還在,有可能會(huì)報(bào)錯(cuò).注意: 方法執(zhí)行完,這個(gè)控制器就已經(jīng)不存在了.
問題描述1:當(dāng)view發(fā)生一些事件的時(shí)候,通知控制器,但是控制器已經(jīng)銷毀了,所以可能出現(xiàn)未知的錯(cuò)誤。
問題描述2:添加一個(gè)開關(guān)按鈕,讓屏幕360度旋轉(zhuǎn)(兩者的效果不一樣)。當(dāng)發(fā)生屏幕旋轉(zhuǎn)事件的時(shí)候,UIapplication對象會(huì)將旋轉(zhuǎn)事件傳遞給uiwindow,uiwindow又會(huì)將旋轉(zhuǎn)事件傳遞給它的根控制器,由根控制器決定是否需要旋轉(zhuǎn)
UIapplication->uiwindow->根控制器(第一種方式?jīng)]有根控制器,所以不能跟著旋轉(zhuǎn))。
提示:不通過控制器的view也可以做開發(fā),但是在實(shí)際開發(fā)中,不要這么做,不要直接把view添加到UIWindow上面去。因?yàn)椋y以管理。


響應(yīng)者鏈的事件傳遞過程:
1>如果當(dāng)前view是控制器的view,那么控制器就是上一個(gè)響應(yīng)者(即是:下面該誰響應(yīng)這個(gè)事件),事件就傳遞給控制器;如果當(dāng)前view不是控制器的view,那么父視圖就是當(dāng)前view的上一個(gè)響應(yīng)者,事件就傳遞給它的父視圖
2>在視圖層次結(jié)構(gòu)的最頂級(jí)視圖,如果也不能處理收到的事件或消息,則其將事件或消息傳遞給window對象進(jìn)行處理
3>如果window對象也不處理,則其將事件或消息傳遞給UIApplication對象
4>如果UIApplication也不能處理該事件或消息,則將其丟棄
總結(jié):
事件的傳遞與響應(yīng):
- 當(dāng)一個(gè)
事件發(fā)生后,事件會(huì)從父控件傳給子控件,也就是說由UIApplication -> UIWindow -> UIView -> initial view,以上就是事件的傳遞。 - 接下來是事件的響應(yīng)。
首先看initial view能否處理這個(gè)事件,如果不能則會(huì)將事件傳遞給其上級(jí)視圖(inital view的superView);如果上級(jí)視圖仍然無法處理則會(huì)繼續(xù)往上傳遞;一直傳遞到視圖控制器view controller,首先判斷視圖控制器的根視圖view是否能處理此事件;如果不能則接著判斷該視圖控制器能否處理此事件,如果還是不能則繼續(xù)向上傳 遞;(對于第二個(gè)圖視圖控制器本身還在另一個(gè)視圖控制器中,則繼續(xù)交給父視圖控制器的根視圖,如果根視圖不能處理則交給父視圖控制器處理);一直到 window,如果window還是不能處理此事件則繼續(xù)交給application處理,如果最后application還是不能處理此事件則將其丟棄 - 在事件的
響應(yīng)中,如果某個(gè)控件實(shí)現(xiàn)了touches...方法,則這個(gè)事件將由該控件來接受,如果調(diào)用了[supertouches….];就會(huì)將事件順著響應(yīng)者鏈條往上傳遞,傳遞給上一個(gè)響應(yīng)者;接著就會(huì)調(diào)用上一個(gè)響應(yīng)者的touches….方法