1.通过storyboard加载控制器
- 需要先设置项目配置文件中不指定storyboard
// 加载完info.plist完毕后调用,若是指定了SB,就去加载SB,若没有指定则执行以下方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 1.创建UIWindow
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 2.创建根控制器(手动加载SB)
// UIStoryboard:用来加载SB文件
// 类方法storyboardWithName:bundle:用来加载指定名称的SB,不需要后缀名
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
// 2.1创建SB描述的控制器
// 方法一:instantiateInitialViewController根据初始化控制器创建SB描述的控制器,即SB中箭头所指的控制器
// ViewController *vc = [sb instantiateInitialViewController];
// 方法二:根据控制器的SB ID创建制定的控制器(需在SB中指定控制器的Storyboard ID)
ViewController *vc = [sb instantiateViewControllerWithIdentifier:@"org"];
// 2.2设置window的根控制器
self.window.rootViewController = vc;
// 3.显示窗口
[self.window makeKeyAndVisible];
return YES;
}
2.通过Xib加载控制器
- 需要先设置项目配置文件中不指定storyboard
// 程序启动完毕后调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 1.创建UIWindow
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 2.创建根控制器(通过Xib创建)
// 2.1指定Xib名称创建控制器
// ViewController *vc = [[ViewController alloc] initWithNibName:@"ZJTestOne" bundle:nil];
// 2.2不指定xib名称创建控制器
ZJTestViewController *vc = [[ZJTestViewController alloc] init];
// 1.判断下nibName有没有值,如果有值,就会去加载nibName指定的xib
// 2.如果nibName为空,会先去查找有没有ZJTestView.xib,如果有就去加载
// 3.如果没有ZJTestView.xib.xib,就会去加载根类名同名的xib:ZJTestViewController.xib
// 4.如果还没有找到,就生成一个空的view
self.window.rootViewController = vc;
// 3.显示窗口
[self.window makeKeyAndVisible];
return YES;
}
3.控制器View的创建
- 控制器的View是懒加载的,只有在需要使用的时候才会创建(即只有在调用了View的getter方法时才会创建view)
- view的创建原理:
-(UIView * __nonnull)view{
if (_view == nil) {
// 记载控制器的View
[self loadView];
// 控制器的View记载完毕
[self viewDidLoad];
}
return _view;
}
loadView方法
- 什么时候调用:当第一次使用控制器的view的时候就会调用
- 作用:加载控制器的View,自定义控制器的View
当指定了从storyboard和Xib加载控制器时,默认实现如下方法
-(void)loadView{
[super loadView];
}
- 一旦在控制器中重写了loadView方法,将不会加载storyboard和Xib的View,会根据loadView中的代码自定义View
// 自定义控制器的View
-(void)loadView{
self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.view.backgroundColor = [UIColor grayColor];
[self.view addSubview:[UIButton buttonWithType:UIButtonTypeContactAdd]];
}
4.控制器的view的默认背景色
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 1.创建UIWindow
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 设置背景颜色
self.window.backgroundColor = [UIColor yellowColor];
// 添加按钮控件
UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
btn.frame = CGRectMake(200, 200, btn.frame.size.width, btn.frame.size.height);
[self.window addSubview:btn];
// 2.创建根控制器
UIViewController *vc = [[UIViewController alloc] init];
// 设置view的透明度为0,即完全透明时可以穿透View点击到btn(alpha<=0.01,代表控件完全透明)
// vc.view.alpha = 0;
// 若不设置透明度,我们点击不了按钮,证明View不是透明的,若是设置透明度接近完全透明可以实现和不设置透明度一样的效果,可以证明view的默认是接近完全透明的颜色,系统默认为[UIColor clearColor]
// vc.view.alpha = 0.02;//等同于下面的颜色设置
vc.view.backgroundColor = [UIColor clearColor];
self.window.rootViewController = vc;
// 3.设置window可见
[self.window makeKeyAndVisible];
return YES;
}