使用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)显示窗口