UIStoryboard加载控制器
1.加载箭头指向的控制器
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//创建 UIStoryboard对象
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
//加载指定箭头的控制器
UIViewController *rootVC = [sb instantiateInitialViewController];
self.window.rootViewController = rootVC;
[self.window makeKeyAndVisible];
2.加载带有标识(Identity)的控制器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//创建 UIStoryboard对象
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
//加载指定箭头的控制器
UIViewController *rootVC = [sb instantiateViewControllerWithIdentifier:@"testSB"];
self.window.rootViewController = rootVC;
[self.window makeKeyAndVisible];
return YES;
}
1.png
3.Storyboard之间的跳转
- 控制器之间的跳转,从图上可以看到,
segue
的选中时,是从源控制器
要跳转到目标控制器
- 给每一个
segue
绑定一个跳转的标识
,蓝色的控制是的标识是oneVC
,粉色控制器的标识是twoVC
- 当我点击
跳转
按钮,我要选择判断要跳转到哪一个控制器
//跳转控制器
- (IBAction)handleSelectController:(UIButton *)sender {
if ([self.isSelectStr isEqualToString:@"oneVC"]) {
[self performSegueWithIdentifier:@"oneVC" sender:nil];
}else {
[self performSegueWithIdentifier:@"twoVC" sender:nil];
}
}
-
performSegueWithIdentifier: sender:
方法内部会调用下面的一个方法
//调用这个方法传值
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
// segue.sourceViewController h获取到的是源控制器
//目标控制器
CCOneVC *oneVC = segue.destinationViewController;
oneVC.targetStr = @"这个是一个传值的属性";
}
- 所以,一般在
segue
跳转,要传值的话,就调用这个方法,根据标识
的不同,给不同的控制器,传值
XIB加载控制器
3.png创建CCXIBVC文件
创建XIB文件,绑定控制器,脱线到View 如下图:
- 加载不同名的xib文件控制器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
CCXibVC *xibVC = [[CCXibVC alloc] initWithNibName:@"xib" bundle:nil];
self.window.rootViewController = xibVC;
[self.window makeKeyWindow];
return YES;
}
- 加载同名的
xib
文件控制器
-
init
加载
xib的加载原理
- 通过
initWithNibName:bundle:
直接加载xib文件,不管xib文件与类名是否相同 - 通过
init
加载
1.
init
底层会调用initWithNibName:bundle:
方法
2.当initWithNibName:bundle:
初始化控制器,并且nibName为nil时,系统就会执行下面的操作
2.1,寻找有没有跟控制器类名同名但是不带Controller的xib,如果有就会去加载(CCRootView.xib)
2.2寻找有没有跟控制器类名同名的xib,如果有就会去加载(CCRootViewController.xib)
2.3如果上述的2个都没有找到,就会创建一个空白的View
控制器View
的生命周期
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
CCXibVC *xibVC = [[CCXibVC alloc] initWithNibName:@"xib" bundle:nil];
self.window.rootViewController = xibVC;
[self.window makeKeyWindow];
return YES;
return YES;
}
从上面的代码中,我们可以知道,控制器创建成功
控制器创建成功之后,要怎么做呢?
1- 控制器创建成功之后,系统创建一个
view
,调用- (void)loadView;
方法
- (void)loadView;
方法其实是一个懒加载,在创建view
之后,会调用viewDidLoad
方法
这个方法的内部实现如下:
- (UIView *)view{
if (!_view) {
_view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self viewDidLoad];
}
return _view;
}
我们可以通过
loadView
,来定义我们自已的使用的控制器View,比如:直接创建使用scrollView
,或者UIImageView
2 -
viewDidLoad
控制器View加载完毕的时候调用
- (void)viewDidLoad {
[super viewDidLoad];
}
3- 控制器View将要显示的时候调用,下面的方法
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
}
4-控制器的View的显示完毕的时候调用
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
}
5-控制器View的将要消失的时候调用
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
}
6- 控制器View已经消失的时候调用
- (void)viewDidDisappear:(BOOL)animated{
[super viewDidAppear:animated];
}
7- 控制器的View将要布局子控件的时候调用 , 控制器View布局子控件完毕的时候调用,这个2个方法调用的比较频繁
只要有子控件添加就会调用 ()
//控制器的View将要布局子控件的时候调用
- (void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
}
//控制器View布局子控件完毕的时候调用
- (void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
}
8-内存警告的时候
- (void)didReceiveMemoryWarning{
[super didReceiveMemoryWarning];
}
9- 下面这个2个方法,是在使用
mrc(手动管理内存)
调用,不过现在已经ARC(系统帮你管理内存)
,已经被废弃了
//view将要销毁
- (void)viewWillUnload NS_DEPRECATED_IOS(5_0,6_0) __TVOS_PROHIBITED;
//view已经销毁
- (void)viewDidUnload NS_DEPRECATED_IOS(3_0,6_0) __TVOS_PROHIBITED;
- View的生命周期方法的调用情况
其实在控制器中,我们可以通过
isViewLoaded
方法,看view是不是已经加载,[self isViewLoaded]
,这个父子
控制使用的时候,经常使用这个方法,来判断控制器的view
是否已经加载
网友评论