亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS應用開發中視圖控件UIWindow的基本使用教程

2020-07-26 03:28:12
字體:
來源:轉載
供稿:網友

一、簡單介紹

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)

添加

20162794811005.png (1081×338)

先創建UIwindow,再創建控制器,創建控制器的view,然后將控制器的view添加到UIWindow上。

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

20162794505633.png (694×375)

二、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的初始化的文檔)

20162794841671.png (837×214)

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

 

四、四大對象的關系圖

20162794906268.png (679×342)

五、主窗口和次窗口說明

代碼:

復制代碼 代碼如下:

// 程序啟動完畢之后就會調用一次
- (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以前中有區別:哪個是主窗口,后面設置為主窗口會把之前設置的覆蓋掉。(只有主窗口才能響應鍵盤的輸入事件,如果不能輸入內容,可以查看是否是顯示在主窗口上,不在主窗口上的不能響應。)
 六、補充說明
在有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顯示出來,即看到了運行后顯示的界面。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩第一区| 韩国精品久久久999| 久久国产精品久久国产精品| 国产日韩欧美在线视频观看| 国产精品亚洲欧美导航| 久精品免费视频| 国产精品女人久久久久久| 日韩福利伦理影院免费| 国产精品吴梦梦| 欧美性高潮在线| 亚洲人成在线观看网站高清| 成人淫片在线看| 精品福利一区二区| 97精品国产aⅴ7777| 日韩成人在线观看| 国产精品日韩在线观看| 午夜精品久久17c| 国产亚洲精品一区二区| 最近日韩中文字幕中文| 在线观看成人黄色| 26uuu亚洲伊人春色| 成人a免费视频| 国产成人精品视频在线观看| 国产日韩av高清| 亚洲色图在线观看| 美女久久久久久久| 国产精品久久久久久久久久久不卡| 亚洲另类激情图| 岛国av一区二区在线在线观看| 丝袜一区二区三区| 国产精品女视频| 色婷婷综合久久久久中文字幕1| 激情亚洲一区二区三区四区| 久久久久久久电影一区| 欧美精品激情视频| 日韩二区三区在线| 97精品久久久中文字幕免费| 亚洲精品国产拍免费91在线| 97人人模人人爽人人喊中文字| 欧美激情一二三| 亚洲美女免费精品视频在线观看| 91在线播放国产| 欧美精品免费在线观看| 国产精品劲爆视频| 4444欧美成人kkkk| 日韩av不卡在线| 这里只有视频精品| 国产91av在线| 久久久精品久久| 欧美在线观看一区二区三区| 欧美激情第三页| 青青青国产精品一区二区| 亚洲第一av网| 福利一区视频在线观看| 亚洲国产精品va在线看黑人| 欧美俄罗斯性视频| 最近日韩中文字幕中文| 色青青草原桃花久久综合| 97国产精品久久| 91香蕉嫩草影院入口| 国产成人精品a视频一区www| 庆余年2免费日韩剧观看大牛| 亚洲欧洲日产国码av系列天堂| 亚洲国产中文字幕在线观看| 国产日本欧美视频| 亚洲第一福利在线观看| 国产精品综合久久久| 欧美激情a∨在线视频播放| 国产日韩欧美影视| 国产亚洲在线播放| 欧美一区二区大胆人体摄影专业网站| 国产精品一区二区久久国产| 77777亚洲午夜久久多人| 国产精品成人在线| 久久久久久久久国产| 精品久久久久久久久久ntr影视| 26uuu亚洲国产精品| 欧美日本精品在线| 久久99亚洲精品| 91地址最新发布| 亚洲天堂av高清| 精品女同一区二区三区在线播放| 91精品美女在线| 91精品国产91久久久久久吃药| 欧美日韩国产成人高清视频| 国产成+人+综合+亚洲欧美丁香花| 国产精品va在线| 国产精品色午夜在线观看| 国产69久久精品成人看| 日韩视频在线一区| 亚洲大尺度美女在线| 亚洲黄一区二区| 欧美疯狂做受xxxx高潮| 日韩成人性视频| 自拍偷拍免费精品| 日韩av在线影院| 国产欧美中文字幕| 欧美一级片在线播放| 久久中文字幕视频| 国产亚洲精品美女久久久| 成人夜晚看av| 亚洲黄色av女优在线观看| 国产综合久久久久| 精品在线小视频| 欧美午夜xxx| 日韩成人免费视频| 国产精品视频网址| 这里只有视频精品| www.国产精品一二区| 91精品中文在线| 欧美亚洲另类在线| 久久乐国产精品| 亚洲国产一区二区三区四区| 欧美性生交xxxxxdddd| 亚洲成人精品视频在线观看| 亚洲美女在线视频| 欧美性猛交xxxxx水多| 日韩一区av在线| 成人亲热视频网站| 精品无码久久久久久国产| 欧美久久精品一级黑人c片| 91久久精品日日躁夜夜躁国产| 日韩在线一区二区三区免费视频| 欧美精品在线观看91| 中文字幕亚洲色图| 久久在线观看视频| 欧美成在线视频| 中文字幕久热精品在线视频| 欧美黄色成人网| 国产精品h在线观看| 91在线国产电影| 欧美裸身视频免费观看| 麻豆乱码国产一区二区三区| 亚洲国产欧美一区二区三区久久| 欧美高清在线观看| 亚洲天堂开心观看| 国产精品成人品| 欧美性理论片在线观看片免费| 精品网站999www| 夜夜狂射影院欧美极品| 北条麻妃久久精品| 日韩第一页在线| 九九视频这里只有精品| 欧美性jizz18性欧美| 久久青草精品视频免费观看| 国产美女搞久久| 国产欧美va欧美va香蕉在| 久久综合88中文色鬼| 97香蕉超级碰碰久久免费的优势| 91精品国产91久久久久福利| 欧美激情亚洲精品| 国产成人精品日本亚洲专区61| 国产一区二区三区在线视频| 97人人模人人爽人人喊中文字| 国产精品情侣自拍| 亚洲在线视频福利| 国产精品美女久久| 欧美在线激情视频| 尤物精品国产第一福利三区| 欧美成人精品一区二区三区| 日韩精品高清在线观看| 精品中文字幕乱| 亚洲韩国日本中文字幕| 91久久国产婷婷一区二区|