小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

3、show—UIWindow簡單介紹

 雪柳花明 2016-04-13

iOS開發(fā)UI篇—UIWindow簡單介紹

一、簡單介紹

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上。

文檔中關于該部分的解釋:

 

二、UIWindow的創(chuàng)建過程

1.簡單說明

創(chuàng)建一個空的項目,就可以看到UIWindow是怎么出來的了。在程序啟動完畢之后就會調用一次,創(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)設置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:添加一個開關按鈕,讓屏幕360度旋轉(兩者的效果不一樣)。當發(fā)生屏幕旋轉事件的時候,UIapplication對象會將旋轉事件傳遞給uiwindow,uiwindow又會將旋轉事件傳遞給它的根控制器,由根控制器決定是否需要旋轉

UIapplication->uiwindow->根控制器(第一種方式?jīng)]有根控制器,所以不能跟著旋轉)。

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

 

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

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

它其實是把創(chuàng)建UIWindow的過程給屏蔽起來了??梢园汛淼腢IWindow的屬性的值打印出來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)建代理,并且把代理設置給application(看項目配置文件info.plist里面的storyboard的name,根據(jù)這個name找到對應的storyboard),開啟一個事件循環(huán),當程序加載完畢,他會調用代理的didFinishLaunchingWithOptions:方法。在調用didFinishLaunchingWithOptions:方法之前,會加載storyboard,在加載的時候創(chuàng)建一個window,接下來會創(chuàng)建箭頭所指向的控制器,把該控制器設置為UIWindow的根控制器,接下來再將window顯示出來,即看到了運行后顯示的界面。(提示:關于這部分可以查看story的初始化的文檔)

三、如何獲取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

 

四、四大對象的關系圖

五、主窗口和次窗口說明

代碼:
復制代碼
// 程序啟動完畢之后就會調用一次
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // 1.創(chuàng)建UIWindow
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // 設置UIWindow的背景顏色
    self.window.backgroundColor = [UIColor redColor];

    // 讓UIWindow顯示出來(讓窗口成為主窗口 并且顯示出來)
    // 一個應用程序只能有一個主窗口
    [self.window makeKeyAndVisible];
    // 讓UIWindow成為主窗口
//    [self.window makeKeyWindow];
    
    // 2. 再創(chuàng)建一個窗口
    UIWindow *w2 = [[UIWindow alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];
    w2.backgroundColor = [UIColor yellowColor];
    [w2 makeKeyAndVisible];
    self.w2 = w2;
    
    
    // 3.創(chuàng)建兩個文本輸入框
    // 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];

    
    // 獲取應用程序的主窗口
    NSLog(@"%@", [UIApplication sharedApplication].keyWindow);
    return YES;
}
復制代碼
代碼說明:
再創(chuàng)建一個窗口(主窗口和次窗口的區(qū)別)
局部變量,需要定義一個Window屬性來保存變量。
window的屬性定義為strong,就是為了讓其不銷毀。
一個應用程序只能有一個主窗口,程序中創(chuàng)建了兩個Window,那么誰是主窗口?后面的窗口能覆蓋前面的窗口。
提示:如果UItextfield不顯示,可以考慮設置它的樣式,因為其創(chuàng)建默認是虛線的,沒有邊框。
在ios7里邊,主窗口和次窗口是沒有區(qū)別的
在ios7以前中有區(qū)別:哪個是主窗口,后面設置為主窗口會把之前設置的覆蓋掉。(只有主窗口才能響應鍵盤的輸入事件,如果不能輸入內(nèi)容,可以查看是否是顯示在主窗口上,不在主窗口上的不能響應。)
 六、補充說明
在有storyboard中的創(chuàng)建過程:
先執(zhí)行Main函數(shù),執(zhí)行UIApplicationMain(),根據(jù)其第三個和第四個參數(shù)創(chuàng)建Application,創(chuàng)建代理,并且把代理設置給application,根據(jù)項目配置文件info.plist里面的storyboard的name,找到對應的storyboard,接下來創(chuàng)建一個window,之后創(chuàng)建它的初始化控制器(就是箭頭所指向的控制器),自動把該控制器設置為UIWindow的根控制器,接下來再將window顯示出來,即看到了運行后顯示的界面。
注意這個控制器屬性面板上的“初始化控制器屬性”。
在沒有storyboard中的創(chuàng)建過程:
先執(zhí)行Main函數(shù),執(zhí)行UIApplicationMain(),根據(jù)其第三個和第四個參數(shù)創(chuàng)建Application,創(chuàng)建代理,并且把代理設置給application,開啟一個事件循環(huán),當程序加載完畢,他會調用代理的didFinishLaunchingWithOptions:方法。在該方法中,會創(chuàng)建一個Window,然后創(chuàng)建一個控制器,并把該控制器設置為UIWindow的根控制器,接下來再將window顯示出來,即看到了運行后顯示的界面。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多