应用程序启动原理
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
ViewController *vc = [[ViewController alloc] init];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
return YES;
}
纯代码创建应用程序
目标
- 掌握纯代码创建应用程序的过程
纯代码创建 App 的写法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
ViewController *vc = [[ViewController alloc] init];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
return YES;
}
演练
- 新建项目
- 删除
Main.storyboard
- 修改应用程序入口,删除
Main.storyboard
运行程序
不报错,但是黑乎乎一片
- 在
AppDelegate
的application:didFinishLaunchingWithOptions:
方法中增加断点
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 断点位置
return YES;
}
po self.window
当不通过故事板
启动程序时self.window
对象不会被创建
- 在此方法中创建 window 并且指定背景颜色
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 1. 常见 window 对象
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
return YES;
}
运行测试,仍然黑乎乎一片
回顾故事板启动过程 —— 让
window
在屏幕可见
- 修改方法,让窗口可见
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 1. 常见 window 对象
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
// 3. 让 window 变成主窗口并且可见
[self.window makeKeyAndVisible];
return YES;
}
运行测试,崩溃,提示信息如下:
Application windows are expected to have a root view controller at the end of application launch
应用程序窗口,在程序启动完成前,期望有一个根视图控制器
- 导入头文件
#import "ViewController.h"
- 设置根控制器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 1. 常见 window 对象
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
// 2. 设置根控制器
// 1> 创建控制器
ViewController *vc = [[ViewController alloc] init];
// 2> 让视图控制器成为根控制器
self.window.rootViewController = vc;
// 3. 让 window 变成主窗口并且可见
[self.window makeKeyAndVisible];
return YES;
}
注意细节:
- 没有设置 vc 的根视图的大小
- 设置的是
window
的大小
实验一
- 在
ViewController
的viewDidLoad
方法中设置根视图背景颜色
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor orangeColor];
}
运行测试,并且旋转屏幕,会发现视图控制器的大小会自动适应
这是因为设置了 UIWindow 的根控制器之后,在设备方向旋转时,UIWindow 会通知视图控制器调整根视图大小
将模拟器切换到慢速动画可以观察动画效果
实验二
-
取消 window 的大小设置
self.window = [[UIWindow alloc] initWithFrame:CGRectZero];
- 新版本的写法
self.window = [[UIWindow alloc] init];
系统底层会自动调整 window 大小,知道就好,建议仍然使用
[[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]
的写法
视图控制器和视图关系
- 视图控制器和视图的关系示意图:
-
关系
- 每一个视图控制器都有一个根视图(强引用)
-
根据视图所要显示的内容,可以在根视图上添加若干个小视图,分别负责不同区域的显示
- 在 IB 中直接拖拽一个子视图到视图中,视图层次关系支持嵌套
- 在代码中通过
addSubView
方法给视图添加子视图
-
无论用何种方式添加的子视图,都记录在其父视图的
subviews
数组中NSArray
会对内部对象强引用
-
为什么要自定义
类
?- 系统默认提供了很多类供程序员使用
- 当系统提供的类无法满足程序员需要时,可以定义这个类的子类
- 在子类中增加自己需要的
属性
和方法
- 子类继承了父类定义的特性(属性和方法),同时又拥有自己定义的
属性
和方法
-
使用自定义类的结果
- 控制器的子类能够
按照程序员的需求
调度 - 视图的子类能够
按照程序员的需求
显示
- 控制器的子类能够
类和对象
-
类
是对对象
的抽象- 类是抽象的,不占用内存
- 类是用于创建对象的蓝图
- 是定义包括在
特定类型
的对象
中的方法
和属性
的软件模板 - 在 OC 中,
类
是一种特殊类型的对象
-
对象
是类
的具体实例- 而对象是具体的,占用存储空间
- 同一个类的对象,具有相同的方法,具有不同的属性