iOS开发

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

2019-04-20  本文已影响0人  追逐_chase

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之间的跳转

2.png
//跳转控制器
- (IBAction)handleSelectController:(UIButton *)sender {
    if ([self.isSelectStr isEqualToString:@"oneVC"]) {
        [self performSegueWithIdentifier:@"oneVC" sender:nil];
    }else {
        [self performSegueWithIdentifier:@"twoVC" sender:nil];
    }
   
}

//调用这个方法传值
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    
    //  segue.sourceViewController h获取到的是源控制器
    //目标控制器
    CCOneVC *oneVC = segue.destinationViewController;
    oneVC.targetStr = @"这个是一个传值的属性";
    
}

XIB加载控制器

创建CCXIBVC文件
创建XIB文件,绑定控制器,脱线到View 如下图:

3.png
- (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;
}
4.png 5.png 6.png

xib的加载原理

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;
7.png

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

喜欢的点个❤️

上一篇 下一篇

猜你喜欢

热点阅读