Storyboard和XIB加载控制器及控制器View的生命周期

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;
}

在这里插入图片描述

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加载控制器

创建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是否已经加载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值