iOS四大對(duì)象之UIWindow及四大對(duì)象之間的關(guān)系

1. UIWindow/使用純代碼加載根控制器

  • UIWindow是一種特殊的UIView,通常在一個(gè)app中只會(huì)有一個(gè)UIWindow
    -iOS程序啟動(dòng)完畢后,創(chuàng)建的第一個(gè)視圖控件就是UIWindow,接著創(chuàng)建控制器的view,最后將控制器的view添加到UIWindow上,于是控制器的view就顯示在屏幕上了

創(chuàng)建的第一個(gè)對(duì)象是:UIApplication

  • 一個(gè)iOS程序之所以能顯示到屏幕上,完全是因?yàn)樗蠻IWindow 。也就說(shuō),沒(méi)有UIWindow,就看不見(jiàn)任何UI界面

1.1 手工創(chuàng)建一個(gè)UIWindow

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//創(chuàng)建窗口,根據(jù)屏幕大小設(shè)置
    UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//    設(shè)置window背景顏色
    window.backgroundColor = [UIColor redColor];
    
//    創(chuàng)建控制器
    UIViewController *mainController = [[UIViewController alloc] init];
    
//    給窗口指定根視圖控制器
    window.rootViewController = mainController;
    
//    讓當(dāng)前窗口成為主窗口并顯示
    [window makeKeyAndVisible];

    return YES;
}
  • 到這里還不會(huì)顯示的原因是因?yàn)樽饔糜?。這都是局部變量,出了作用域就失效了。
  • 所以需要在AppDelegate.h里面創(chuàng)建一個(gè)強(qiáng)引用的屬性,定義window。然后賦值。
  • 主窗口同一時(shí)刻只能有一個(gè)UIWindow *keyW = application.keyWindows;

1.2 對(duì)window進(jìn)行操作

// 讓當(dāng)前UIWindow變成keyWindow,并顯示出來(lái)
- (void)makeKeyAndVisible; 


/// 獲取當(dāng)前應(yīng)用程序的主窗口
- [UIApplication sharedApplication].keyWindow

// 獲取view對(duì)象所在的窗口
- view.window

// 獲取當(dāng)前程序所有的window
- [UIApplication sharedApplication].windows

1.3 UIWindow.h

//默認(rèn)是[UIScreen mainScreen]。修改屏幕的操作代價(jià)非常大
//NS_AVAILABLE_IOS(3_2)
@property(nonatomic,retain) UIScreen *screen ;    

//// default = 0.0,窗口級(jí)別越高,顯示越靠前
@property(nonatomic) UIWindowLevel windowLevel;    

//是否是主窗口                    
@property(nonatomic,readonly,getter=isKeyWindow)BOOLkeyWindow;

//為子類提供。不要直接調(diào)用
- (void)becomeKeyWindow; 
//為子類提供。不要直接調(diào)用
- (void)resignKeyWindow;                                               

//成為主窗口
- (void)makeKeyWindow;
//簡(jiǎn)化方法,讓窗口成為主窗口并且可見(jiàn),如果要不可見(jiàn),可以使用view的hidden屬性
- (void)makeKeyAndVisible;

2. UIWindow的創(chuàng)建過(guò)程

2.1 在有storyboard中的創(chuàng)建過(guò)程

  • 先執(zhí)行Main函數(shù),執(zhí)行UIApplicationMain(),根據(jù)其第三個(gè)和第四個(gè)參數(shù)創(chuàng)建Application
  • 創(chuàng)建代理,并且把代理設(shè)置給application
  • 根據(jù)項(xiàng)目配置文件info.plist里面的storyboard的name,找到對(duì)應(yīng)的storyboard
  • 接下來(lái)創(chuàng)建一個(gè)window
  • 之后創(chuàng)建它的初始化控制器(就是箭頭所指向的控制器),自動(dòng)把該控制器設(shè)置為UIWindow的根控制器
  • 接下來(lái)再將window顯示出來(lái),即看到了運(yùn)行后顯示的界面。

5.4.2 在純代碼中的創(chuàng)建過(guò)程

  • 先執(zhí)行Main函數(shù),執(zhí)行UIApplicationMain(),根據(jù)其第三個(gè)和第四個(gè)參數(shù)創(chuàng)建Application
  • 創(chuàng)建代理,并且把代理設(shè)置給application
  • 開(kāi)啟一個(gè)事件循環(huán),當(dāng)程序加載完畢,調(diào)用代理的didFinishLaunchingWithOptions:方法。
  • 在該方法中,創(chuàng)建一個(gè)Window
  • 然后創(chuàng)建一個(gè)控制器,并把該控制器設(shè)置為UIWindow的根控制器
  • 接下來(lái)再將window顯示出來(lái),即看到了運(yùn)行后顯示的界面。

3. 四大對(duì)象之間的關(guān)系

  • 1.UIApplication :delegate屬性
  • 2.AppDelegate :window屬性
  • 3.UIWindow :rootViewController屬性
  • 4.UIViewController :view屬性

第一個(gè)創(chuàng)建的對(duì)象是UIApplication
UIApplication綁定一個(gè)AppDelegate對(duì)象
AppDelegate對(duì)象中有一個(gè)window屬性(UIWindow)
UIWindow對(duì)象中有一個(gè)rootViewController的屬性
rootViewController設(shè)置成要顯示的UIViewController
最后 顯示出UIViewController對(duì)象的view

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容