UIWindow*window 獲取的4種方法 異同點(diǎn)

UIWindow *window = [[UIApplication sharedApplication]windows].lastObject;
UIWindow *window = [[UIApplication sharedApplication].windows lastObject];
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIWindow *window = [[UIApplication sharedApplication].delegate window];
UIView *view = [[UIViewalloc]initWithFrame:CGRectMake(100,100,100,100)];
view.backgroundColor= [UIColor redColor];
[window addSubview:view];

UIWindow &&view&&UIViewController&&app開(kāi)始運(yùn)行到彈出界面的過(guò)程
一抚垄、設(shè)置主窗口
[self.window makeKeyAndVisible] 讓窗口成為主窗口并顯示出來(lái)(單獨(dú)對(duì)view是沒(méi)有辦法自己顯示出來(lái)的秤掌,必須要依托UIWindow)
[self.window make keyWindow[ 讓UIWindow成為主窗口但不顯示出來(lái)
二、獲取UIWindow
①獲取視圖view的列表數(shù)組:[UIApplication sharedApplication].windows (UIApplication指當(dāng)前應(yīng)用程序,windows為UIApplication的屬性,獲取視圖列表)
②獲取主視圖:[UIApplication sharedApplication].keyWindow keyWindows是UIApplication的主視圖屬性。同時(shí)只有當(dāng)前視圖是主視圖
③獲取某個(gè)view所在的UIWindow:view.window
三、窗口創(chuàng)建、視圖顯示過(guò)程
main函數(shù)-->UIApplication(argc,argv,nil,NSStringFromClass([AppDelegate class])
(第三個(gè)參數(shù)是主要類誓沸,是UIApplication的子類,nil指的就是UIApplication即當(dāng)前應(yīng)用程序壹粟;第四個(gè)參數(shù)是代理類拜隧,遵循UIApplicationDelegate宿百,負(fù)責(zé)控制程序的運(yùn)行。)
通過(guò)這兩個(gè)參數(shù)創(chuàng)建application洪添、創(chuàng)建代理垦页,并把代理設(shè)置給application--->調(diào)用delegate對(duì)象(一般就是APPDelegate)的application:didFinishLaunchingWithOption:方法


接下來(lái)分兩種情況
①有storyboard時(shí):根據(jù)info.plist里面的name(即main nib file base name項(xiàng)),找到對(duì)應(yīng)的storyboard干奢,接下來(lái)創(chuàng)建一個(gè)window--->>c創(chuàng)建其的控制器(就是箭頭指的那個(gè))痊焊,并自動(dòng)把這個(gè)控制器設(shè)置為UIWindow的根控制器。
②沒(méi)有storyboard時(shí):
調(diào)用方法后忿峻,創(chuàng)建UIWindow-->創(chuàng)建UIWindow的rootViewController--->顯示窗口
注意:第二種方法會(huì)更快薄啥。方法是刪去info.plist中的main nib file base name項(xiàng),代碼如下(通用代碼):
-(BOOL)application:(UIApplication) didFinishLaunchingOptions:(NSDictionary)launchOptions
{
self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];//mainScreen獲取當(dāng)前屏幕尺寸逛尚;bounds指的是全屏垄惧;applicationFrame指的是除了狀態(tài)欄的全屏;
if([[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPhone)
{
self.viewController=[[viewController alloc]initWithNibName:@"viewController_iPhone" bundle:nil];//創(chuàng)建window
}
else
{
self.viewController=[[viewController alloc[initWithNibName:@"viewController_iPad: bundle:nil];
}
self.window.rootViewController=self.viewController;//設(shè)置根控制器
[self.window makeKeyAndVisible];//設(shè)置主視圖并顯示
return YES;
}
(該方法負(fù)責(zé)controller類的初始化)
在不用判斷是iPhone還是iPad時(shí)黑低,這個(gè)方法可以更加簡(jiǎn)便:
-(BOOL)application:(UIApplication)didFinishLaunchingOptions:(NSDictionary
)launchOptions
{
self.window=[[UIWindow alloc] initWithFrame:[[UIWindow mainScreen] bounds];
self.window.backgroundColor=[UIColor whiteColor];
self.window.rootViewController=self.viewController;//設(shè)置根控制器
[self.window.makeKeyAndVisible];//設(shè)置為主窗口并顯示
return YES赘艳;
}
總的過(guò)程就是 創(chuàng)建application--->創(chuàng)建代理--->UIWindow
在上面兩段代碼中,self.window.rootViewController=self.viewController設(shè)置根控制器其實(shí)就是將view添加到UIWindow
http://www.it165.net/pro/html/201406/15046.html這里有個(gè)圖克握,來(lái)自官方文檔,十分清晰枷踏。UIWindow和view通過(guò)根控制器viewController連接
將view添加到UIWindow還有另外一個(gè)方法 addSubview --------->[self.window addSubview:self.view];
但是不推薦這種不通過(guò)根控制器直接添加view的做法菩暗,原因:
①控制器上可能有按鈕等點(diǎn)擊事件。而控制器是局部變量旭蠕,若控制器不存在了停团,而view還存在,會(huì)出錯(cuò)掏熬;
②若要實(shí)現(xiàn)通過(guò)屏幕上的按鈕控制屏幕旋轉(zhuǎn)佑稠,是由根控制器控制旋轉(zhuǎn)的;而第二種方法因?yàn)楦緵](méi)有用根控制器旗芬,自然也無(wú)法旋轉(zhuǎn)
三舌胶、UIApplication
方法sharedApplication:獲取應(yīng)用程序的句柄
屬性delegate獲取UIApplicationDelegate實(shí)現(xiàn)類的實(shí)例(一般是APPDelegate)
屬性windows獲取當(dāng)前程序涉及到的窗口類數(shù)組
屬性keywindow獲取當(dāng)前程序的主窗口
UIApplication的其他應(yīng)用還包括:設(shè)置應(yīng)用圖標(biāo)右上角的紅色數(shù)字;設(shè)置聯(lián)網(wǎng)指示器的可見(jiàn)性疮丛;管理狀態(tài)欄(需要先修改info.plist)幔嫂;利用openURL:方法實(shí)現(xiàn)打電話發(fā)短信發(fā)郵件打開(kāi)網(wǎng)頁(yè)和跳轉(zhuǎn)到其他APP
四、UIApplicationDelegate
其實(shí)例化一般就是AppDelegate誊薄,負(fù)責(zé)管理app被打斷時(shí)履恩,通知代理進(jìn)入后臺(tái)
aplplication:didFinshLaunchingWithOptions:程序加載完畢
applicationDidBecameActive:程序獲取焦點(diǎn)(可交互)
applicationDidEnterBackground:程序進(jìn)入后臺(tái)
applicationDidResignActive:程序失去焦點(diǎn)(不可交互)
applicationWillEnterForeground:程序從后臺(tái)回到前臺(tái)
applicationDidReciveMemoryWarning:內(nèi)存警告,可能要終止程序
applicationWillTerminate:程序即將退出

http://blog.csdn.net/chengyingzhilian/article/details/7872096

一呢蔫、UIWindow是一種特殊的UIView切心,通常在一個(gè)程序中只會(huì)有一個(gè)UIWindow,但可以手動(dòng)創(chuàng)建多個(gè)UIWindow,同時(shí)加到程序里面绽昏。UIWindow在程序中主要起到三個(gè)作用:
1协屡、作為容器,包含app所要顯示的所有視圖
2而涉、傳遞觸摸消息到程序中view和其他對(duì)象
3著瓶、與UIViewController協(xié)同工作,方便完成設(shè)備方向旋轉(zhuǎn)的支持
二啼县、通常我們可以采取兩種方法將view添加到UIWindow中:
1材原、addSubview
直接將view通過(guò)addSubview方式添加到window中,程序負(fù)責(zé)維護(hù)view的生命周期以及刷新季眷,但是并不會(huì)為去理會(huì)view對(duì)應(yīng)的ViewController余蟹,因此采用這種方法將view添加到window以后,我們還要保持view對(duì)應(yīng)的ViewController的有效性子刮,不能過(guò)早釋放威酒。
2、rootViewController
rootViewController時(shí)UIWindow的一個(gè)遍歷方法挺峡,通過(guò)設(shè)置該屬性為要添加view對(duì)應(yīng)的ViewController葵孤,UIWindow將會(huì)自動(dòng)將其view添加到當(dāng)前window中,同時(shí)負(fù)責(zé)ViewController和view的生命周期的維護(hù)橱赠,防止其過(guò)早釋放
三尤仍、WindowLevel
UIWindow在顯示的時(shí)候會(huì)根據(jù)UIWindowLevel進(jìn)行排序的,即Level高的將排在所有Level比他低的層級(jí)的前面狭姨。下面我們來(lái)看UIWindowLevel的定義:
constUIWindowLevel UIWindowLevelNormal;
constUIWindowLevel UIWindowLevelAlert;
constUIWindowLevel UIWindowLevelStatusBar;
typedef CGFloat UIWindowLevel;
IOS系統(tǒng)中定義了三個(gè)window層級(jí)宰啦,其中每一個(gè)層級(jí)又可以分好多子層級(jí)(從UIWindow的頭文件中可以看到成員變量CGFloat_windowSublevel;),不過(guò)系統(tǒng)并沒(méi)有把則個(gè)屬性開(kāi)出來(lái)饼拍。UIWindow的默認(rèn)級(jí)別是UIWindowLevelNormal赡模,我們打印輸出這三個(gè)level的值分別如下:
[objc]view plaincopy
print?
2012-03-2722:46:08.752UIViewSample[395:f803] Normal windowlevel:0.000000
2012-03-2722:46:08.754UIViewSample[395:f803] Normal windowlevel:2000.000000
2012-03-2722:46:08.755UIViewSample[395:f803] Normal windowlevel:1000.000000
這樣印證了他們級(jí)別的高低順序從小到大為Normal < StatusBar < Alert,下面請(qǐng)看小的測(cè)試代碼:
TestWindowLevel


  • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    self.window.backgroundColor = [UIColor yellowColor];
    [self.window makeKeyAndVisible];
    UIWindow *normalWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    normalWindow.backgroundColor = [UIColor blueColor];
    normalWindow.windowLevel = UIWindowLevelNormal;
    [normalWindow makeKeyAndVisible];
    CGRect windowRect = CGRectMake(50,
    50,
    [[UIScreen mainScreen] bounds].size.width -100,
    [[UIScreen mainScreen] bounds].size.height -100);
    UIWindow *alertLevelWindow = [[UIWindow alloc] initWithFrame:windowRect];
    alertLevelWindow.windowLevel = UIWindowLevelAlert;
    alertLevelWindow.backgroundColor = [UIColor redColor];
    [alertLevelWindow makeKeyAndVisible];
    UIWindow *statusLevelWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0,50,320,20)];
    statusLevelWindow.windowLevel = UIWindowLevelStatusBar;
    statusLevelWindow.backgroundColor = [UIColor blackColor];
    [statusLevelWindow makeKeyAndVisible];
    NSLog(@"Normal window level: %f", UIWindowLevelNormal);
    NSLog(@"Normal window level: %f", UIWindowLevelAlert);
    NSLog(@"Normal window level: %f", UIWindowLevelStatusBar);
    returnYES;
    }

運(yùn)行結(jié)果如下圖:


我們可以注意到兩點(diǎn):
1)我們生成的normalWindow雖然是在第一個(gè)默認(rèn)的window之后調(diào)用makeKeyAndVisible师抄,但是仍然沒(méi)有顯示出來(lái)漓柑。這說(shuō)明當(dāng)Level層級(jí)相同的時(shí)候,只有第一個(gè)設(shè)置為KeyWindow的顯示出來(lái)司澎,后面同級(jí)的再設(shè)置KeyWindow也不會(huì)顯示欺缘。
2)statusLevelWindow在alertLevelWindow之后調(diào)用makeKeyAndVisible,淡仍然只是顯示在alertLevelWindow的下方挤安。這說(shuō)明UIWindow在顯示的時(shí)候是不管KeyWindow是誰(shuí)谚殊,都是Level優(yōu)先的,即Level最高的始終顯示在最前面蛤铜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嫩絮,一起剝皮案震驚了整個(gè)濱河市丛肢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剿干,老刑警劉巖蜂怎,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異置尔,居然都是意外死亡杠步,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)榜轿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)幽歼,“玉大人,你說(shuō)我怎么就攤上這事谬盐〉樗剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵飞傀,是天一觀的道長(zhǎng)皇型。 經(jīng)常有香客問(wèn)我,道長(zhǎng)砸烦,這世上最難降的妖魔是什么弃鸦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮幢痘,結(jié)果婚禮上寡键,老公的妹妹穿的比我還像新娘。我一直安慰自己雪隧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布员舵。 她就那樣靜靜地躺著脑沿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪马僻。 梳的紋絲不亂的頭發(fā)上庄拇,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音韭邓,去河邊找鬼措近。 笑死,一個(gè)胖子當(dāng)著我的面吹牛女淑,可吹牛的內(nèi)容都是我干的瞭郑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鸭你,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼屈张!你這毒婦竟也來(lái)了擒权?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤阁谆,失蹤者是張志新(化名)和其女友劉穎碳抄,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體场绿,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剖效,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了焰盗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片璧尸。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖姨谷,靈堂內(nèi)的尸體忽然破棺而出逗宁,到底是詐尸還是另有隱情,我是刑警寧澤梦湘,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布瞎颗,位于F島的核電站,受9級(jí)特大地震影響捌议,放射性物質(zhì)發(fā)生泄漏哼拔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一瓣颅、第九天 我趴在偏房一處隱蔽的房頂上張望倦逐。 院中可真熱鬧,春花似錦宫补、人聲如沸檬姥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)健民。三九已至,卻和暖如春贫贝,著一層夾襖步出監(jiān)牢的瞬間秉犹,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工稚晚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留崇堵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓客燕,卻偏偏與公主長(zhǎng)得像鸳劳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幸逆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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

  • UIView的功能 負(fù)責(zé)渲染區(qū)域的內(nèi)容棍辕,并且響應(yīng)該區(qū)域內(nèi)發(fā)生的觸摸事件 UIWindow 在iOS App中暮现,UI...
    小蘑菇2閱讀 778評(píng)論 4 5
  • 每一個(gè)IOS程序都有一個(gè)UIWindow,在我們通過(guò)模板簡(jiǎn)歷工程的時(shí)候楚昭,xcode會(huì)自動(dòng)幫我們生成一個(gè)window...
    jumping鵬閱讀 1,032評(píng)論 0 0
  • UIWindow是Cocoa框架的重要組件之一栖袋,所有的UIView都要通過(guò)UIWindow來(lái)進(jìn)行展現(xiàn),沒(méi)有UIWi...
    文興閱讀 4,946評(píng)論 3 34
  • *7月8日上午 N:Block :跟一個(gè)函數(shù)塊差不多抚太,會(huì)對(duì)里面所有的內(nèi)容的引用計(jì)數(shù)+1塘幅,想要解決就用__block...
    炙冰閱讀 2,489評(píng)論 1 14
  • EXC_BAD_ACCESS的本質(zhì)詳解以及僵尸模式調(diào)試原理 - 簡(jiǎn)書(shū) 有時(shí)候,你會(huì)遇到由EXC_BAD_ACCES...
    ivin閱讀 1,061評(píng)論 0 1