不废话,先看示意图
####1. 控制器View的创建方式流程图
网友总结流程图如下:
官方示意图如下:
####2. 代码
- 重写了loadveiw
- storyboard和xib都没有
- 有storyboard
- 有指定xib
- 有同名xib
- 有同名去掉controller的xib
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 创建UIWindow
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
//1.重写控制器的loadview方法
//如果重写了控制器的loadview方法, 就不会去加载创建同名去掉controller的xib和同名的xib, 而是根据loadview里面的描述创建View,如果loadview方法里面没创建,那self.view就是nil
NJViewController *vc = [[NJViewController alloc] init];
//2.没有xib和storyboard
//如果没有xib和storyboard, 会自动创建一个空白的view做为控制器的veiw
NJViewController *vc = [[NJViewController alloc] init];
//3.有storyboard
//如果有storyboard,通过storyboard创建, 会创建箭头指向的view做为控制器的view
//(如果重写了控制器的loadview方法, 就不会创建storyboard中描述的view作为控制器的view, 而是创建一个空白的veiw做为控制器的veiw)
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"customStorybard" bundle:nil];
NJViewController *vc = [storyboard instantiateInitialViewController];
//4.有指定xib
//如果有指定xib, 会创建指定xib中描述的veiw作为控制器的veiw
NJViewController *vc = [[NJViewController alloc] initWithNibName:@"customxib" bundle:nil];
//5.有同名xib
//如果有同名的xib, 会自动找到同名xib中描述的view作为控制器的view
NJViewController *vc = [[NJViewController alloc] init];
//6.有同名去掉Controller的xib
//如果有同名去掉Controller的xib, 会自动找到该xib的view做为控制器的view
NJViewController *vc = [[NJViewController alloc] init];
// 设置控制器为window的根控制器
self.window.rootViewController = vc;
// 显示window
[self.window makeKeyAndVisible];
return YES;
}
关于loadView:
- 当控制器需要显示控制器的view的时候就会调用loadView
- 一旦重写了loadView方法,就说明要自己定义View.
- loadView一般使用的场景:
① 当控制器的View显示的就是一张图片,或者UIWebView,可以节省内存
-(void)loadView {
UIImageView *imageV = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"火影"]];
imageV.userInteractionEnabled = YES;
self.view = imageV;
}
② 将View和Controller的代码分离
- (void)loadView{
[super loadView];
SecondView *view = [[SecondView alloc] init];
view.backgroundColor = [UIColor redColor];
self.view = view;
}
但是怎么监听view里面的属性呢?可以使用KVO。
//SecondView里面有一个skipToThree属性,使用KVO监听它
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addObserverSuny:self keyPath:@"skipToThree" block:^(id newValue) {
NSLog(@"处理业务");
}];
}
- 控制器的view是延迟加载的,用到时再加载
- 可以用isViewLoaded方法判断一个UIViewController的view是否已经被加载
- 控制器的view加载完毕就会调用viewDidLoad方法