iOS開(kāi)發(fā)UI篇—UIWindow簡(jiǎn)單介紹 一、簡(jiǎn)單介紹 UIWindow是一種特殊的UIView,,通常在一個(gè)app中只會(huì)有一個(gè)UIWindow iOS程序啟動(dòng)完畢后,,創(chuàng)建的第一個(gè)視圖控件就是UIWindow,接著創(chuàng)建控制器的view,,最后將控制器的view添加到UIWindow上,,于是控制器的view就顯示在屏幕上了 一個(gè)iOS程序之所以能顯示到屏幕上,,完全是因?yàn)樗蠻IWindow。也就說(shuō),,沒(méi)有UIWindow,,就看不見(jiàn)任何UI界面 補(bǔ)充:UIWindow是創(chuàng)建的第一個(gè)視圖控件(創(chuàng)建的第一個(gè)對(duì)象是UIapplication)如下圖: 添加 先創(chuàng)建UIwindow,再創(chuàng)建控制器,創(chuàng)建控制器的view,,然后將控制器的view添加到UIWindow上,。 文檔中關(guān)于該部分的解釋:
二、UIWindow的創(chuàng)建過(guò)程 1.簡(jiǎn)單說(shuō)明 創(chuàng)建一個(gè)空的項(xiàng)目,,就可以看到UIWindow是怎么出來(lái)的了,。在程序啟動(dòng)完畢之后就會(huì)調(diào)用一次,創(chuàng)建過(guò)程如下: 提示:應(yīng)用程序啟動(dòng)之后,,先創(chuàng)建Application,,再創(chuàng)建它的代理,之后創(chuàng)建UIwindow,。UIWindow繼承自UIview,。
2.把view添加到uiwindow 創(chuàng)建一個(gè)控制器,把view添加到uiwindow上面(有兩種方式) (1)直接將控制器的view添加到UIWindow中,,并不理會(huì)它對(duì)應(yīng)的控制器 [self.window addsubview:vc.view]; (2)設(shè)置uiwindow的根控制器,,自動(dòng)將rootviewcontroller的view添加到window中,負(fù)責(zé)管理rootviewcontroller的生命周期 [self.window.rootviewcontroller=vc];
兩個(gè)方法的區(qū)別: 以后的開(kāi)發(fā)中,,建議使用(2).因?yàn)榉椒ǎ?)存在一些問(wèn)題,,比如說(shuō)控制器上面可能由按鈕,需要監(jiān)聽(tīng)按鈕的點(diǎn)擊事件,,如果是1,,那么按鈕的事件應(yīng)該由控制器來(lái)進(jìn)行管理。但控制器是一個(gè)局部變量,,控制器此時(shí)已經(jīng)不存在了,,但是控制器的view還在,此時(shí)有可能會(huì)報(bào)錯(cuò),。注意:方法執(zhí)行完,,這個(gè)控制器就已經(jīng)不存在了。 問(wèn)題描述1:當(dāng)view發(fā)生一些事件的時(shí)候,,通知控制器,,但是控制器已經(jīng)銷毀了,所以可能出現(xiàn)未知的錯(cuò)誤,。 問(wèn)題描述2:添加一個(gè)開(kāi)關(guān)按鈕,,讓屏幕360度旋轉(zhuǎn)(兩者的效果不一樣)。當(dāng)發(fā)生屏幕旋轉(zhuǎn)事件的時(shí)候,,UIapplication對(duì)象會(huì)將旋轉(zhuǎn)事件傳遞給uiwindow,uiwindow又會(huì)將旋轉(zhuǎn)事件傳遞給它的根控制器,,由根控制器決定是否需要旋轉(zhuǎn) UIapplication->uiwindow->根控制器(第一種方式?jīng)]有根控制器,,所以不能跟著旋轉(zhuǎn))。 提示:不通過(guò)控制器的view也可以做開(kāi)發(fā),,但是在實(shí)際開(kāi)發(fā)中,,不要這么做,不要直接把view添加到UIWindow上面去,。因?yàn)?,難以管理。
3.在有storyboard的項(xiàng)目中,,UIWindow是如何創(chuàng)建的,? 為什么創(chuàng)建一個(gè)storyboard,沒(méi)有看到創(chuàng)建uiwindow的過(guò)程,? 它其實(shí)是把創(chuàng)建UIWindow的過(guò)程給屏蔽起來(lái)了??梢园汛淼腢IWindow的屬性的值打印出來(lái)NSLog(@“window=%p”,self.window);打印出來(lái)確實(shí)是有值的,,說(shuō)明確實(shí)創(chuàng)建了UIWindow.不僅創(chuàng)建了UIWindow,默認(rèn)還創(chuàng)建了UIWindow對(duì)應(yīng)的控制器,,也可以打印進(jìn)行查看,。NSLog(@“%@“,self.window.rootviewcontroller); 有storyboard的項(xiàng)目中的創(chuàng)建過(guò)程: 當(dāng)用戶點(diǎn)擊應(yīng)用程序圖標(biāo)的時(shí)候,先執(zhí)行Main函數(shù),,執(zhí)行UIApplicationMain(),根據(jù)其第三個(gè)和第四個(gè)參數(shù)創(chuàng)建Application,,創(chuàng)建代理,并且把代理設(shè)置給application(看項(xiàng)目配置文件info.plist里面的storyboard的name,,根據(jù)這個(gè)name找到對(duì)應(yīng)的storyboard),,開(kāi)啟一個(gè)事件循環(huán),當(dāng)程序加載完畢,,他會(huì)調(diào)用代理的didFinishLaunchingWithOptions:方法,。在調(diào)用didFinishLaunchingWithOptions:方法之前,會(huì)加載storyboard,,在加載的時(shí)候創(chuàng)建一個(gè)window,,接下來(lái)會(huì)創(chuàng)建箭頭所指向的控制器,把該控制器設(shè)置為UIWindow的根控制器,,接下來(lái)再將window顯示出來(lái),,即看到了運(yùn)行后顯示的界面。(提示:關(guān)于這部分可以查看story的初始化的文檔) 三,、如何獲取window? 1.主窗口和次窗口 【self.window makekeyandvisible】讓窗口成為主窗口,,并且顯示出來(lái)。有這個(gè)方法,,才能把信息顯示到屏幕上,。 因?yàn)閃indow有makekeyandvisible這個(gè)方法,,可以讓這個(gè)Window憑空的顯示出來(lái),而其他的view沒(méi)有這個(gè)方法,,所以它只能依賴于Window,,Window顯示出來(lái)后,view才依附在Window上顯示出來(lái),。 【self.window make keywindow】//讓uiwindow成為主窗口,,但不顯示。
2.獲取UIwindow (1)[UIApplication sharedApplication].windows 在本應(yīng)用中打開(kāi)的UIWindow列表,,這樣就可以接觸應(yīng)用中的任何一個(gè)UIView對(duì)象(平時(shí)輸入文字彈出的鍵盤(pán),,就處在一個(gè)新的UIWindow中) (2)[UIApplication sharedApplication].keyWindow(獲取應(yīng)用程序的主窗口)用來(lái)接收鍵盤(pán)以及非觸摸類的消息事件的UIWindow,而且程序中每個(gè)時(shí)刻只能有一個(gè)UIWindow是keyWindow,。 提示:如果某個(gè)UIWindow內(nèi)部的文本框不能輸入文字,,可能是因?yàn)檫@個(gè)UIWindow不是keyWindow (3)view.window獲得某個(gè)UIView所在的UIWindow
四、四大對(duì)象的關(guān)系圖 五,、主窗口和次窗口說(shuō)明 代碼:
// 程序啟動(dòng)完畢之后就會(huì)調(diào)用一次 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 1.創(chuàng)建UIWindow self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // 設(shè)置UIWindow的背景顏色 self.window.backgroundColor = [UIColor redColor]; // 讓UIWindow顯示出來(lái)(讓窗口成為主窗口 并且顯示出來(lái)) // 一個(gè)應(yīng)用程序只能有一個(gè)主窗口 [self.window makeKeyAndVisible]; // 讓UIWindow成為主窗口 // [self.window makeKeyWindow]; // 2. 再創(chuàng)建一個(gè)窗口 UIWindow *w2 = [[UIWindow alloc] initWithFrame:CGRectMake(100, 100, 200, 200)]; w2.backgroundColor = [UIColor yellowColor]; [w2 makeKeyAndVisible]; self.w2 = w2; // 3.創(chuàng)建兩個(gè)文本輸入框 // 3.1將文本輸入框添加到window中 UITextField *tx1 = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 200, 40)]; tx1.borderStyle = UITextBorderStyleRoundedRect; [self.window addSubview:tx1]; // 3.2將文本輸入框添加到w2中 UITextField *tx2 = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 100, 40)]; tx2.borderStyle = UITextBorderStyleRoundedRect; [self.w2 addSubview:tx2]; // 獲取應(yīng)用程序的主窗口 NSLog(@"%@", [UIApplication sharedApplication].keyWindow); return YES; } 代碼說(shuō)明:
再創(chuàng)建一個(gè)窗口(主窗口和次窗口的區(qū)別)
局部變量,,需要定義一個(gè)Window屬性來(lái)保存變量。
window的屬性定義為strong,,就是為了讓其不銷毀,。
一個(gè)應(yīng)用程序只能有一個(gè)主窗口,程序中創(chuàng)建了兩個(gè)Window,,那么誰(shuí)是主窗口,?后面的窗口能覆蓋前面的窗口。
提示:如果UItextfield不顯示,,可以考慮設(shè)置它的樣式,,因?yàn)槠鋭?chuàng)建默認(rèn)是虛線的,沒(méi)有邊框,。
在ios7里邊,,主窗口和次窗口是沒(méi)有區(qū)別的
在ios7以前中有區(qū)別:哪個(gè)是主窗口,后面設(shè)置為主窗口會(huì)把之前設(shè)置的覆蓋掉,。(只有主窗口才能響應(yīng)鍵盤(pán)的輸入事件,,如果不能輸入內(nèi)容,可以查看是否是顯示在主窗口上,,不在主窗口上的不能響應(yīng),。)
六、補(bǔ)充說(shuō)明
在有storyboard中的創(chuàng)建過(guò)程:
先執(zhí)行Main函數(shù),,執(zhí)行UIApplicationMain(),根據(jù)其第三個(gè)和第四個(gè)參數(shù)創(chuàng)建Application,,創(chuàng)建代理,并且把代理設(shè)置給application,,根據(jù)項(xiàng)目配置文件info.plist里面的storyboard的name,,找到對(duì)應(yīng)的storyboard,,接下來(lái)創(chuàng)建一個(gè)window,之后創(chuàng)建它的初始化控制器(就是箭頭所指向的控制器),,自動(dòng)把該控制器設(shè)置為UIWindow的根控制器,,接下來(lái)再將window顯示出來(lái),即看到了運(yùn)行后顯示的界面,。
注意這個(gè)控制器屬性面板上的“初始化控制器屬性”,。
在沒(méi)有storyboard中的創(chuàng)建過(guò)程:
先執(zhí)行Main函數(shù),執(zhí)行UIApplicationMain(),根據(jù)其第三個(gè)和第四個(gè)參數(shù)創(chuàng)建Application,,創(chuàng)建代理,,并且把代理設(shè)置給application,開(kāi)啟一個(gè)事件循環(huán),,當(dāng)程序加載完畢,,他會(huì)調(diào)用代理的didFinishLaunchingWithOptions:方法。在該方法中,,會(huì)創(chuàng)建一個(gè)Window,然后創(chuàng)建一個(gè)控制器,,并把該控制器設(shè)置為UIWindow的根控制器,接下來(lái)再將window顯示出來(lái),,即看到了運(yùn)行后顯示的界面。
|
|