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