iOS 中的UIWindow

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

相关文章
相关标签/搜索