你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS運用開辟中視圖控件UIWindow的根本應用教程

iOS運用開辟中視圖控件UIWindow的根本應用教程

編輯:IOS開發綜合

1、簡略引見

iPhone運用法式平日只要一個窗口,表現為一個UIWindow類的實例。運用法式在啟動時(或許從nib文件停止裝載)創立這個窗口,並往窗口中參加一或多個視圖並顯示出來。以後我們很少須要再次援用它。UIWindow對象是一切UIView的根,治理和調和的運用法式的顯示。普通運用法式只要一個UIWindow對象,即便有多個UIWindow對象,也只要一個UIWindow可以接收到用戶的觸屏事宜。
在IOS中,UIWindow對象並沒有像windows運用法式中罕見的封閉框或題目欄如許的部件,通俗用戶不克不及直接對其停止封閉或其它操作。一切對窗口的操作都須要經由過程其編程接口來完成。運用法式可以借助窗口對象來停止事宜傳遞。窗口對象會連續跟蹤以後的第一呼應者對象,並在UIApplication對象提出要求時將事宜傳遞它。
UIWindow是一種特別的UIView,平日在一個app中只會有一個UIWindow
在Mac OS X中,NSWindow的父類是NSResponder;而在iPhone OS中,UIWindow的父類是UIView。是以,UIWindow窗口在IOS中也是一個視圖對象。
在創立運用法式窗口時,應當老是將其初始的邊框尺寸設置為全部屏幕的年夜小。假如您的窗口是從nib文件裝載獲得,Interface Builder其實不許可創立比屏幕尺寸小的窗口;但是,假如您的窗口是經由過程編程方法創立的,則必需在創立時傳入希冀的邊框矩形。除屏幕矩形以外,沒有來由傳入其它邊框矩形。
IOS法式啟動終了後,創立的第一個視圖控件就是UIWindow,接著創立掌握器的view,最初將掌握器的view添加到UIWindow上,因而掌握器的view就顯示在屏幕上了

一個iOS法式之所以能顯示到屏幕上,完整是由於它有UIWindow。也就說,沒有UIWindow,就看不見任何UI界面

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

20162793914810.png (1101×336)

添加

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615474209.png (1081×338)

先創立UIwindow,再創立掌握器,創立掌握器的view,然後將掌握器的view添加到UIWindow上。

文檔中關於該部門的說明:

20162794505633.png (694×375)

2、UIWindow的創立進程

1.簡略解釋

創立一個空的項目,便可以看到UIWindow是怎樣出來的了。在法式啟動終了以後就會挪用一次,創立進程以下:
20162794524695.png (807×434)提醒:運用法式啟動以後,先創立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的初始化的文檔)

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615474264.png (837×214)

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、四年夜對象的關系圖

20162794906268.png (679×342)

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顯示出來,即看到了運轉後顯示的界面。

20162794924310.png (564×398)

留意這個掌握器屬性面板上的“初始化掌握器屬性”。
 
在沒有storyboard中的創立進程:
先履行Main函數,履行UIApplicationMain(),依據其第三個和第四個參數創立Application,創立署理,而且把署理設置給application,開啟一個事宜輪回,當法式加載終了,他會挪用署理的didFinishLaunchingWithOptions:辦法。在該辦法中,會創立一個Window,然後創立一個掌握器,並把該掌握器設置為UIWindow的根掌握器,接上去再將window顯示出來,即看到了運轉後顯示的界面。

【iOS運用開辟中視圖控件UIWindow的根本應用教程】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved