IOS開發(fā)系列——UIView專題之一:UIWindow篇

UIView專題

1UIWindow

1.1UIWindow簡介

UIWindow是一種特殊的UIView,通常在一個app中只會有一個UIWindow。

iOS程序啟動完畢后,創(chuàng)建的第一個視圖控件就是UIWindow,接著創(chuàng)建控制器的view,最后將控制器的view添加到UIWindow上,于是控制器的view就顯示在屏幕上了。

一個iOS程序之所以能顯示到屏幕上,完全是因為它有UIWindow。也就說,沒有UIWindow,就看不見任何UI界面。

補充:UIWindow是創(chuàng)建的第一個視圖控件(創(chuàng)建的第一個對象是UIapplication)如下圖:


添加


先創(chuàng)建UIwindow,再創(chuàng)建控制器,創(chuàng)建控制器的view,然后將控制器的view添加到UIWindow上。

文檔中關(guān)于該部分的解釋:


1.2UIWindow的創(chuàng)建過程

1.簡單說明

創(chuàng)建一個空的項目,就可以看到UIWindow是怎么出來的了。在程序啟動完畢之后就會調(diào)用一次,創(chuàng)建過程如下:

提示:應用程序啟動之后,先創(chuàng)建Application,再創(chuàng)建它的代理,之后創(chuàng)建UIwindow。UIWindow繼承自UIview。

2.把view添加到uiwindow

創(chuàng)建一個控制器,把view添加到uiwindow上面(有兩種方式)

(1)直接將控制器的view添加到UIWindow中,并不理會它對應的控制器

[self.window ?addsubview:vc.view];

(2)設(shè)置uiwindow的根控制器,自動將rootviewcontroller的view添加到window中,負責管理rootviewcontroller的生命周期

[self.window.rootviewcontroller=vc];

兩個方法的區(qū)別:

以后的開發(fā)中,建議使用(2).因為方法(1)存在一些問題,比如說控制器上面可能由按鈕,需要監(jiān)聽按鈕的點擊事件,如果是1,那么按鈕的事件應該由控制器來進行管理。但控制器是一個局部變量,控制器此時已經(jīng)不存在了,但是控制器的view還在,此時有可能會報錯。注意:方法執(zhí)行完,這個控制器就已經(jīng)不存在了。

問題描述1:當view發(fā)生一些事件的時候,通知控制器,但是控制器已經(jīng)銷毀了,所以可能出現(xiàn)未知的錯誤。

問題描述2:添加一個開關(guān)按鈕,讓屏幕360度旋轉(zhuǎn)(兩者的效果不一樣)。當發(fā)生屏幕旋轉(zhuǎn)事件的時候,UIapplication對象會將旋轉(zhuǎn)事件傳遞給uiwindow,uiwindow又會將旋轉(zhuǎn)事件傳遞給它的根控制器,由根控制器決定是否需要旋轉(zhuǎn)UIapplication->uiwindow->根控制器(第一種方式?jīng)]有根控制器,所以不能跟著旋轉(zhuǎn))。

提示:不通過控制器的view也可以做開發(fā),但是在實際開發(fā)中,不要這么做,不要直接把view添加到UIWindow上面去。因為,難以管理。

3.在有storyboard的項目中,UIWindow是如何創(chuàng)建的?

為什么創(chuàng)建一個storyboard,沒有看到創(chuàng)建uiwindow的過程?

它其實是把創(chuàng)建UIWindow的過程給屏蔽起來了。可以把代理的UIWindow的屬性的值打印出來NSLog(@“window=%p”,self.window);打印出來確實是有值的,說明確實創(chuàng)建了UIWindow.不僅創(chuàng)建了UIWindow,默認還創(chuàng)建了UIWindow對應的控制器,也可以打印進行查看。NSLog(@“%@“,self.window.rootviewcontroller);

有storyboard的項目中的創(chuàng)建過程:

當用戶點擊應用程序圖標的時候,先執(zhí)行Main函數(shù),執(zhí)行UIApplicationMain(),根據(jù)其第三個和第四個參數(shù)創(chuàng)建Application,創(chuàng)建代理,并且把代理設(shè)置給application(看項目配置文件info.plist里面的storyboard的name,根據(jù)這個name找到對應的storyboard),開啟一個事件循環(huán),當程序加載完畢,他會調(diào)用代理的didFinishLaunchingWithOptions:方法。在調(diào)用didFinishLaunchingWithOptions:方法之前,會加載storyboard,在加載的時候創(chuàng)建一個window,接下來會創(chuàng)建箭頭所指向的控制器,把該控制器設(shè)置為UIWindow的根控制器,接下來再將window顯示出來,即看到了運行后顯示的界面。(提示:關(guān)于這部分可以查看story的初始化的文檔)


1.3如何獲取window?

1.主窗口和次窗口

【self.window?makekeyandvisible】讓窗口成為主窗口,并且顯示出來。有這個方法,才能把信息顯示到屏幕上。

因為Window有makekeyandvisible這個方法,可以讓這個Window憑空的顯示出來,而其他的view沒有這個方法,所以它只能依賴于Window,Window顯示出來后,view才依附在Window上顯示出來。

【self.window make keywindow】//讓uiwindow成為主窗口,但不顯示。

2.獲取UIwindow

(1)[UIApplication?sharedApplication].windows在本應用中打開的UIWindow列表,這樣就可以接觸應用中的任何一個UIView對象(平時輸入文字彈出的鍵盤,就處在一個新的UIWindow中)。

(2)[UIApplication

sharedApplication].keyWindow(獲取應用程序的主窗口)用來接收鍵盤以及非觸摸類的消息事件的UIWindow,而且程序中每個時刻只能有一個UIWindow是keyWindow。

提示:如果某個UIWindow內(nèi)部的文本框不能輸入文字,可能是因為這個UIWindow不是keyWindow。

(3)view.window獲得某個UIView所在的UIWindow。

1.4四大對象的關(guān)系圖


1.5主窗口和次窗口說明

代碼:

//程序啟動完畢之后就會調(diào)用一次

- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

// 1.創(chuàng)建UIWindow

self.window =[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

//設(shè)置UIWindow的背景顏色

self.window.backgroundColor = [UIColor redColor];

//讓UIWindow顯示出來(讓窗口成為主窗口并且顯示出來)

//一個應用程序只能有一個主窗口

[self.windowmakeKeyAndVisible];

//讓UIWindow成為主窗口

//[self.window makeKeyWindow];

// 2.再創(chuàng)建一個窗口

UIWindow *w2 =[[UIWindow alloc] initWithFrame:CGRectMake(100,100,200,200)];

w2.backgroundColor = [UIColor yellowColor];

[w2makeKeyAndVisible];

self.w2 = w2;

// 3.創(chuàng)建兩個文本輸入框

// 3.1將文本輸入框添加到window中

UITextField*tx1 = [[UITextField alloc] initWithFrame:CGRectMake(10,10,200,40)];

tx1.borderStyle= UITextBorderStyleRoundedRect;

[self.windowaddSubview:tx1];

// 3.2將文本輸入框添加到w2中

UITextField*tx2 = [[UITextField alloc] initWithFrame:CGRectMake(10,10,100,40)];

tx2.borderStyle= UITextBorderStyleRoundedRect;

[self.w2addSubview:tx2];

//獲取應用程序的主窗口

NSLog(@"%@", [UIApplicationsharedApplication].keyWindow);

returnYES;

}

代碼說明:

再創(chuàng)建一個窗口(主窗口和次窗口的區(qū)別)

局部變量,需要定義一個Window屬性來保存變量。

window的屬性定義為strong,就是為了讓其不銷毀。

一個應用程序只能有一個主窗口,程序中創(chuàng)建了兩個Window,那么誰是主窗口?后面的窗口能覆蓋前面的窗口。

提示:如果UItextfield不顯示,可以考慮設(shè)置它的樣式,因為其創(chuàng)建默認是虛線的,沒有邊框。

在ios7里邊,主窗口和次窗口是沒有區(qū)別的。

在ios7以前中有區(qū)別:哪個是主窗口,后面設(shè)置為主窗口會把之前設(shè)置的覆蓋掉。(只有主窗口才能響應鍵盤的輸入事件,如果不能輸入內(nèi)容,可以查看是否是顯示在主窗口上,不在主窗口上的不能響應。)

1.6補充說明

在有storyboard中的創(chuàng)建過程:

先執(zhí)行Main函數(shù),執(zhí)行UIApplicationMain(),根據(jù)其第三個和第四個參數(shù)創(chuàng)建Application,創(chuàng)建代理,并且把代理設(shè)置給application,根據(jù)項目配置文件info.plist里面的storyboard的name,找到對應的storyboard,接下來創(chuàng)建一個window,之后創(chuàng)建它的初始化控制器(就是箭頭所指向的控制器),自動把該控制器設(shè)置為UIWindow的根控制器,接下來再將window顯示出來,即看到了運行后顯示的界面。

注意這個控制器屬性面板上的“初始化控制器屬性”。

在沒有storyboard中的創(chuàng)建過程:

先執(zhí)行Main函數(shù),執(zhí)行UIApplicationMain(),根據(jù)其第三個和第四個參數(shù)創(chuàng)建Application,創(chuàng)建代理,并且把代理設(shè)置給application,開啟一個事件循環(huán),當程序加載完畢,他會調(diào)用代理的didFinishLaunchingWithOptions:方法。在該方法中,會創(chuàng)建一個Window,然后創(chuàng)建一個控制器,并把該控制器設(shè)置為UIWindow的根控制器,接下來再將window顯示出來,即看到了運行后顯示的界面

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內(nèi)容

  • *7月8日上午 N:Block :跟一個函數(shù)塊差不多,會對里面所有的內(nèi)容的引用計數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,510評論 1 14
  • UIWindow 基本概念一個iOS程序之所以能顯示到屏幕上,完全是因為它有UIWindow,是一種特殊的UIVi...
    馬文濤閱讀 7,490評論 2 7
  • UIWindow 1.什么是UIWindow?官方文檔解釋窗口和屏幕,尺寸 2.之前都沒有創(chuàng)建UIWindow,怎...
    SoManyDumb閱讀 299評論 0 0
  • 一場秋雨一場寒,又到了考驗孩子免疫力的時候了,秋天悄悄來了,如何提高孩子免疫力呢?今天給大家分享一妙招,孩子吃的很...
    幸福養(yǎng)生堂閱讀 421評論 0 0
  • 最近新上演的《藍色大海的傳說》又是引起了一片女生的熱追,經(jīng)常看到女生瘋狂追劇說花癡,為什么沒有看到多數(shù)男...
    幸福happy閱讀 3,022評論 0 1