UIWindow用于管理控制器,UIWindow有一个根控制器(rootViewController一种管理视图的容器),视图控制器(ViewController)本身无法显示,它是通过本身的根视图(view)来显示的。现在Xcode会默认初始化该根控制器,不再需要我们手动初始化了,但是为了更好地理解UIWindow和ViewController(视图控制器),我们需要研究一下它们的内部代码实现。
在AppDelegate.m文件里,我们手动书写一下初始化根控制器的代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//初始化window
//[UIScreen mainScreen].bounds = (0,0,屏幕宽度,屏幕高度)
self.window.rootViewController = nil;
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//初始化根控制器:一种管理视图的容器
//视图控制器本身无法显示,视图控制器通过它本身的根视图做显示
ViewController *rootVC = [[ViewController alloc] init];
//设置根控制器的根视图的颜色
rootVC.view.backgroundColor = [UIColor orangeColor];
//设置window的根控制器
self.window.rootViewController = rootVC;
//显示窗口
[self.window makeKeyAndVisible];
return YES;
}
在VIewControll.m里面系统自动为我们生成了 viewDidLoad()方法。
实际上viewDidLoad()只是VIewController生命周期的一部分,下面我们来剖析一些VIewControllerd的完整生命周期。
1.在根视图加载完成之前系统默认会调用loadView()方法,该方法用于加载根控制器的根视图,其内部实现代码如下所示:
//加载根视图
//此方法一般不去重写
- (void)loadView
{
[super loadView];
NSLog(@"loadView");
//创建了与屏幕大小相同,背景颜色为白色的view
//内部实现机制
UIView *view;
//使用懒加载,用到view的时候才去加载
if (self.view == nil)
{
view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
view.backgroundColor = [UIColor whiteColor];
self.view = view;
}
}
2.根视图已经加载完成之后会调用viewDidLoad()方法
//根视图已经加载完成
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"viewDidLoad");
}
3.接着系统在视图将要呈现时会调用viewWillAppear()方法
// 视图将要呈现
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"viewWillAppear");
}
4.视图已经呈现后会调用viewDidAppear()方法
//视图已经呈现
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"viewDidAppear");
}
5.视图将要消失时会调用viewWillDisappear()方法
//视图将要消失
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
NSLog(@"viewWillDisappear");
}
6.视图已经消失后会调用viewDidDisappear()方法
//视图已经消失
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
NSLog(@"viewDidDisappear");
}
我们运行程序就可以看到直观的ViewController生命周期