iOS開發UI篇—UIWindow簡單介紹

iOS開發UI篇—UIWindow簡單介紹ios

1、簡單介紹windows

UIWindow是一種特殊的UIView,一般在一個app中只會有一個UIWindowapp

iOS程序啓動完畢後,建立的第一個視圖控件就是UIWindow,接着建立控制器的view,最後將控制器的view添加到UIWindow上,因而控制器的view就顯示在屏幕上了函數

一個iOS程序之因此能顯示到屏幕上,徹底是由於它有UIWindow。也就說,沒有UIWindow,就看不見任何UI界面ui

補充:UIWindow是建立的第一個視圖控件(建立的第一個對象是UIapplication)以下圖:spa

添加3d

先建立UIwindow,再建立控制器,建立控制器的view,而後將控制器的view添加到UIWindow上。代理

文檔中關於該部分的解釋:code

 

2、UIWindow的建立過程對象

1.簡單說明

建立一個空的項目,就能夠看到UIWindow是怎麼出來的了。在程序啓動完畢以後就會調用一次,建立過程以下:

提示:應用程序啓動以後,先建立Application,再建立它的代理,以後建立UIwindow。UIWindow繼承自UIview。

 

2.把view添加到uiwindow

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

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

[self.window  addsubview:vc.view];

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

[self.window.rootviewcontroller=vc];

 

兩個方法的區別:

之後的開發中,建議使用(2).由於方法(1)存在一些問題,好比說控制器上面可能由按鈕,須要監聽按鈕的點擊事件,若是是1,那麼按鈕的事件應該由控制器來進行管理。但控制器是一個局部變量,控制器此時已經不存在了,可是控制器的view還在,此時有可能會報錯。注意:方法執行完,這個控制器就已經不存在了。

問題描述1:當view發生一些事件的時候,通知控制器,可是控制器已經銷燬了,因此可能出現未知的錯誤。

問題描述2:添加一個開關按鈕,讓屏幕360度旋轉(二者的效果不同)。當發生屏幕旋轉事件的時候,UIapplication對象會將旋轉事件傳遞給uiwindow,uiwindow又會將旋轉事件傳遞給它的根控制器,由根控制器決定是否須要旋轉

UIapplication->uiwindow->根控制器(第一種方式沒有根控制器,因此不能跟着旋轉)。

提示:不經過控制器的view也能夠作開發,可是在實際開發中,不要這麼作,不要直接把view添加到UIWindow上面去。由於,難以管理。

 

3.在有storyboard的項目中,UIWindow是如何建立的?

爲何建立一個storyboard,沒有看到建立uiwindow的過程?

它實際上是把建立UIWindow的過程給屏蔽起來了。能夠把代理的UIWindow的屬性的值打印出來NSLog(@「window=%p」,self.window);打印出來確實是有值的,說明確實建立了UIWindow.不只建立了UIWindow,默認還建立了UIWindow對應的控制器,也能夠打印進行查看。NSLog(@「%@「,self.window.rootviewcontroller);

有storyboard的項目中的建立過程:

當用戶點擊應用程序圖標的時候,先執行Main函數,執行UIApplicationMain(),根據其第三個和第四個參數建立Application,建立代理,而且把代理設置給application(看項目配置文件info.plist裏面的storyboard的name,根據這個name找到對應的storyboard),開啓一個事件循環,當程序加載完畢,他會調用代理的didFinishLaunchingWithOptions:方法。在調用didFinishLaunchingWithOptions:方法以前,會加載storyboard,在加載的時候建立一個window,接下來會建立箭頭所指向的控制器,把該控制器設置爲UIWindow的根控制器,接下來再將window顯示出來,即看到了運行後顯示的界面。(提示:關於這部分能夠查看story的初始化的文檔)

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內部的文本框不能輸入文字,多是由於這個UIWindow不是keyWindow

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

 

4、四大對象的關係圖

5、主窗口和次窗口說明

代碼:
複製代碼

// 程序啓動完畢以後就會調用一次
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 1.建立UIWindow
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// 設置UIWindow的背景顏色
self.window.backgroundColor = [UIColor redColor];

// 讓UIWindow顯示出來(讓窗口成爲主窗口 而且顯示出來)
// 一個應用程序只能有一個主窗口
[self.window makeKeyAndVisible];
// 讓UIWindow成爲主窗口
// [self.window makeKeyWindow];

// 2. 再建立一個窗口
UIWindow *w2 = [[UIWindow alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];
w2.backgroundColor = [UIColor yellowColor];
[w2 makeKeyAndVisible];
self.w2 = w2;


// 3.建立兩個文本輸入框
// 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;
}

複製代碼
代碼說明:
再建立一個窗口(主窗口和次窗口的區別)
局部變量,須要定義一個Window屬性來保存變量。
window的屬性定義爲strong,就是爲了讓其不銷燬。
一個應用程序只能有一個主窗口,程序中建立了兩個Window,那麼誰是主窗口?後面的窗口能覆蓋前面的窗口。
提示:若是UItextfield不顯示,能夠考慮設置它的樣式,由於其建立默認是虛線的,沒有邊框。
在ios7裏邊,主窗口和次窗口是沒有區別的
在ios7之前中有區別:哪一個是主窗口,後面設置爲主窗口會把以前設置的覆蓋掉。(只有主窗口才能響應鍵盤的輸入事件,若是不能輸入內容,能夠查看是不是顯示在主窗口上,不在主窗口上的不能響應。)
 6、補充說明
在有storyboard中的建立過程:
先執行Main函數,執行UIApplicationMain(),根據其第三個和第四個參數建立Application,建立代理,而且把代理設置給application,根據項目配置文件info.plist裏面的storyboard的name,找到對應的storyboard,接下來建立一個window,以後建立它的初始化控制器(就是箭頭所指向的控制器),自動把該控制器設置爲UIWindow的根控制器,接下來再將window顯示出來,即看到了運行後顯示的界面。
注意這個控制器屬性面板上的「初始化控制器屬性」。
 
在沒有storyboard中的建立過程:
先執行Main函數,執行UIApplicationMain(),根據其第三個和第四個參數建立Application,建立代理,而且把代理設置給application,開啓一個事件循環,當程序加載完畢,他會調用代理的didFinishLaunchingWithOptions:方法。在該方法中,會建立一個Window,而後建立一個控制器,並把該控制器設置爲UIWindow的根控制器,接下來再將window顯示出來,即看到了運行後顯示的界面。
相關文章
相關標籤/搜索