使用Xcode新建一個工程後,Xcode會自動新建一些文件,其中有AppDelegate.h,AppDelegate.m,ViewController.h,ViewController.m,Main.storyboard。AppDelegate.h中有一個對象是UIWindow,代碼以下:windows
@property (strong, nonatomic) UIWindow *window;
那麼,這個window的做用是什麼呢?app
實際上,一個app之因此可以顯示在屏幕上,就是由於有該UIWindow對象。只有UIWindow可以主動顯示,其餘的view能夠添加到UIWindow上,這樣,其餘的view也得以顯示在屏幕上。ide
雖然在Xcode7中已經不能新建一個沒有storyboard的工程,可是咱們能夠經過修改程序的Main Interface來測試UIWindow。方法以下:測試
點擊工程->General,將Main Interface 改成空。以下圖:atom
這時候再運行程序,會發現整個屏幕黑屏,以下圖:spa
黑屏的緣由就是由於沒有實現UIWindow。code
如今,手動實現下UIWindow。對象
在AppDelegate.m中添加window的代碼:blog
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; }
此時運行程序會發現有錯誤,錯誤提示以下:事件
'NSInternalInconsistencyException', reason: 'Application windows are expected to have a root view controller at the end of application launch'
提示沒有rootViewController。也就是說,須要設置UIWindow對象的rootViewController。
設置UIWindow的rootViewController代碼以下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; // 設置rootViewController ViewController *controller = [[ViewController alloc] init]; self.window.rootViewController = controller; return YES; }
運行程序,會看到和沒有修改Main Interface 以前是同樣的。
咱們知道,在app程序啓動後,會馬上調用
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法,在該方法中能夠設置 UIWindow和UIWindow 的 rootViewController。這樣,整個app就顯示在屏幕上。
在Xcode中新建工程時,一般狀況下會包含 storyboard 文件,此時是不須要在上面的方法中設置 UIWindow的。那麼,在有storyboard文件的狀況下,是如何設置UIWindow的呢?
實際上,程序在加載主要storyboard的時候(也就是Main Interface 指向的storyboard),就會設置UIWindow和UIWindow的rootViewController。
總結下一個app程序的啓動過程:
1: 調用 main 方法
2:調用 UIApplicationMain方法,在該方法中會作下面兩件事:
(1)建立UIApplication對象
(2)建立UIApplication的delegate對象
3.1 在沒有storyboard的狀況下,delegate對象開始監聽系統事件:
(1)程序啓動完畢的時候,就會調用 application:didFinishLaunchingWithOptions 方法
(2)在 application:didFinishLaunchingWithOptions 方法中建立UIWindow
(3)建立和設置UIWindow的rootViewController
(4)顯示創庫
3.2 在有storyboard的狀況下,根據Info.plist得到最主要的storyboard的文件名,加載最主要的storyboard:
(1)建立UIWindow
(2)建立和設置UIWindow的rootViewController
(3)顯示窗口