美文网首页iOS开发
Storyboard和XIB加载控制器及控制器View的生命周期

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

作者: 追逐_chase | 来源:发表于2019-04-20 13:54 被阅读0次

    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
    2.png
    • 当我点击跳转按钮,我要选择判断要跳转到哪一个控制器
    //跳转控制器
    - (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 如下图:

    3.png
    • 加载不同名的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文件控制器
    4.png
    • init加载
    5.png 6.png

    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的生命周期方法的调用情况
    7.png

    其实在控制器中,我们可以通过isViewLoaded方法,看view是不是已经加载,[self isViewLoaded],这个父子控制使用的时候,经常使用这个方法,来判断控制器的view是否已经加载

    喜欢的点个❤️

    相关文章

      网友评论

        本文标题:Storyboard和XIB加载控制器及控制器View的生命周期

        本文链接:https://www.haomeiwen.com/subject/linkgqtx.html