第十四章 创建控制器
控制器常见的创建方式有以下几种
1.控制器常见的创建方式有以下几种
2.直接创建
3.指定xib文件来创建
直接创建
JXViewController *mj = [[JXViewController alloc] init];
通过xib创建控制器
- 一定要描述xib文件的拥有者为控制器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
ViewController * viewer = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
self.window.rootViewController = viewer;
[self.window makeKeyAndVisible];
return YES;
}
这里我们还需要在xib中做一些设置
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 这三个方法运行结果是一样的,因为底层调用的是[[ViewController alloc] initWithNibName:nil bundle:nil];系统会自动调用跟类名相同的xib相同的。
// ViewController * viewer = [[ViewController alloc] init];
// ViewController * viewer = [[ViewController alloc] initWithNibName:nil bundle:nil];
ViewController * viewer = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
self.window.rootViewController = viewer;
[self.window makeKeyAndVisible];
return YES;
}
// 加载跟类名相同的xib
// 如果描述控制器的view的xib跟控制器的类名相同,就会去加载
// 如果控制器的init方法,底层会调用initWithNibName: bundle:
// 只要通过initWithNibName: bundle:初始化控制器
// 1.寻找有没有跟类名相同,但不带Controller的xib,如果有就会去加载(优先级最高)
// 2.寻找有没有跟类名相同的xib,如果有就加载(优先级次之)
// 3.如果都没有就会创建一个空的view
// viewController:内部实现,在任何地方调用self.view的时候回先调用这个懒加载方法。所以有时候在viewDidLoad中设置view可能不会正确的显示
- (UIView *)view {
if (_view == nil) {
[self loadView];
[self viewDidLoad];
}
return _view;
}
// 在viewDidLoad打印控制器的尺寸是不准确的,通常在viewDidAppear中显示
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
}
通过storyboard创建控制器
- 先加载storyboard文件(Test是storyboard的文件名)
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
接着初始化storyboard中的控制器
初始化“初始控制器”(箭头所指的控制器)
JXViewController *jx = [storyboard instantiateInitialViewController];
通过一个标识初始化对应的控制器
JXViewController *mj = [storyboard instantiateViewControllerWithIdentifier:@”JX"];
控制器view的延迟加载
控制器的view是延迟加载的:用到时再加载
可以用isViewLoaded方法判断一个UIViewController的view是否已经被加载
控制器的view加载完毕就会调用viewDidLoad方法
多控制器
一个iOS的app很少只由一个控制器组成,除非这个app极其简单
当app中有多个控制器的时候,我们就需要对这些控制器进行管理
有多个view时,可以用一个大的view去管理1个或者多个小view
控制器也是如此,用1个控制器去管理其他多个控制器
比如,用一个控制器A去管理3个控制器B、C、D 控制器A被称为控制器B、C、D的“父控制器” 控制器B、C、D的被称为控制器A的“子控制器”
- 为了便于管理控制器,iOS提供了2个比较特殊的控制器
- UINavigationController
- UITabBarController