UIApplication
- 整个app中只有一个UIApplication实例,它是单例的
UIApplicationMain的底层实现
- 根据principalClassName提供类名创建UIApplication对象
- 创建UIApplicationDelegate对象,并且成为UIApplication对象代理,app.delegate = delegate
- 开启一个主运行循环,处理事件,可以保持程序一直运行
- 加载info.plist,并且判断有没有指定main.storyboard,如果指定,就去加载
loadView的作用:自定义控制器的view
- 调用时间:第一次使用控制器的view的时候调用
- 注意:在这个方法中如果没有自定义view,就不能获取控制器的view
- 一旦重写了这个方法,就不要调用[super loadView]
- 如果重写了这个方法,就不会去加载storyboard描述的控制器的view
控制器view的创建步骤
- 只有控制器的init方法底层会调用initWithNibName:bundle:
- 只要通过initWithNibName:bundle:初始化控制器,并且nibName为nil,就会执行以下几步。
- 寻找有没有跟控制器类名同名但不带Controller的xib,如果有就会去加载
- 寻找有没有跟控制器类名同名的xib,如果有就会去加载
- 如果都没有找到,则创建空的view
控制器view的懒加载
- 创建UIViewController控制器,控制器的view并没有创建
- 控制器的view懒加载:第一次使用的时候才会去加载,并不是创建UIViewController控制器的时候去加载
- 如果控制器是窗口的根控制器就可以不用设置尺寸
self.view = [[UIView alloc] initWithFrame:CGRectZero];
- 在viewDidLoad方法(在控制器的view加载完成的时候调用)中打印控制器的尺寸是不准确的,通常在viewDidApper方法(在view完全显示的时候调用)中打印
导航控制器的简单使用
- 程序启动完成后调用didFinishLaunchingWithOptions方法中
// 创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 创建导航控制器的根控制器,也属于导航控制器的子控制器
UIViewController *vc = [[OneViewController alloc] init];
vc.view.backgroundColor = [UIColor redColor];
// 导航控制器也需要一个根控制器
// 默认导航控制器把根控制器的view添加到导航控制器的view上
UINavigationController *navVc = [[UINavigationController alloc] initWithRootViewController:vc];
// 设置窗口的根控制器
self.window.rootViewController = navVc;
[self.window makeKeyAndVisible];
TwoViewController *vc = [[TwoViewController alloc] init];
vc.view.backgroundColor = [UIColor yellowColor];
// 跳转
// 如果导航控制器调用push(进栈),就会把vc添加为导航控制器的子控制器
[self.navigationController pushViewController:vc animated:YES];
// pop(出栈)不是马上把控制器销毁,而是等动画完毕以后调用dealloc方法后才进行销毁
// 回到上一个界面
[self.navigationController popViewControllerAnimated:YES];
// 注意:只能返回到栈里面的控制器
[self.navigationController popToViewController:self.navigationController.childViewControllers[0] animated:YES];
// [self.navigationController popToRootViewControllerAnimated:YES];
网友评论