[iOS开发]ViewController生命周期

涉及函数

viewDidLoad:当ViewController的view对象载入内存后调用,用于对view进行额外的初始化操作。loadView时还没有view,而viewDidLoad时view已经创建好了。

loadView:每次访问controller的view(比如controller.view、self.view)且view为nil,loadView方法就会被调用。用于创建Controller的View。

viewWillAppear: 视图将要显示

viewWillLayoutSubviews:当一个视图的边界发生变化,也就是调整其子视图的位置。你的视图控制器可以重写此方法在layoutSubViews之前生效以重新布局子视图。该方法的默认实现不执行任何操作。

1、addSubview会触发viewWillLayoutSubviews

2、设置self.view及子视图的frame.size会触发layoutSubviews,当然前提是frame.size的值设置前后发生了变化,注意,此处不是origin,呼应官方文档上的边界发生变化

3、滚动一个UIScrollView(该scrollview有子视图的时候)会触发layoutSubviews

4、横竖屏幕切换会触发

viewDidLayoutSubviews: 控制器的view布局子控件完成

viewDidAppear: 视图已经显示

viewWillDisappear: 视图将要消失

扫描二维码关注公众号,回复: 11877979 查看本文章

viewDidDisappear: 视图已经消失,在Controller被切换时调用,第二个视图出现后第一

VIewController的生命周期

在这里插入图片描述

代码显示


//viewcontroller.m
#import "ViewController.h"
#import "secondViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    
    
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    NSLog(@"viewDidLoad");
    
    UIButton *testButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [self.view addSubview:testButton];
    [testButton setFrame:CGRectMake(200, 200, 80, 80)];
    [testButton setTitle:@"按钮" forState:UIControlStateNormal];
    [testButton addTarget:self action:@selector(press) forControlEvents:UIControlEventTouchUpInside];
    
}

- (void)loadView{
    
    
    [super loadView];
    NSLog(@"loadView");
}
- (void)viewDidAppear:(BOOL)animated{
    
    
    NSLog(@"viewDidAppear");
}
- (void)viewDidDisappear:(BOOL)animated{
    
    
    NSLog(@"viewDidDisappear");
}
- (void)viewWillAppear:(BOOL)animated{
    
    
    NSLog(@"viewWillAppear");
}
- (void)viewWillDisappear:(BOOL)animated{
    
    
    NSLog(@"viewWillDisappear");
}
- (void)viewDidLayoutSubviews{
    
    
    NSLog(@"viewDidLayoutSubviews");
}
- (void)viewWillLayoutSubviews{
    
    
    NSLog(@"viewWillLayoutSubviews");
}

- (void)press{
    
    
    secondViewController *secondView = [[secondViewController alloc]init];
    secondView.modalPresentationStyle = UIModalPresentationFullScreen;
    [self presentViewController:secondView animated:YES completion:nil];
}

@end


//secondviewcontroller.m
#import "secondViewController.h"

@interface secondViewController ()

@end

@implementation secondViewController

- (void)viewDidLoad {
    
    
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor whiteColor];
    
    UIButton *back = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [back setTitle:@"返回" forState:UIControlStateNormal];
    [back setFrame:CGRectMake(200, 200, 80, 80)];
    [self.view addSubview:back];
    [back addTarget:self action:@selector(pressBack) forControlEvents:UIControlEventTouchUpInside];
    
}

- (void)viewDidDisappear:(BOOL)animated {
    
    
    NSLog(@"secondviewDidDisappear");
}

- (void)viewWillDisappear:(BOOL)animated {
    
    
    NSLog(@"secondviewWillDisappear");
}

- (void)viewDidAppear:(BOOL)animated {
    
    
    NSLog(@"secondviewDidAppear");
}

- (void)viewWillAppear:(BOOL)animated {
    
    
    NSLog(@"secondviewWillAppear");
}


-(void)pressBack{
    
    
    [self dismissViewControllerAnimated:YES completion:nil];
}

@end





结果
在这里插入图片描述

点击第二页按钮后
在这里插入图片描述

总结:

  1. 因为一开始有addSubview一个Button,所以会出现viewWillLayouSubviews;
  2. 为什么每个viewDidLoad方法中都要使用[super viewDidLoad] ?
    父类中的viewDidLoad会帮助你做一些初始化的工作,比如A是基类,B从A继承,B在viewDidLoad方法中创建和初始化了一些成员,C继承B,如果C在调用viewDidLoad的时候没有调用super的viewDidLoad方法,那么就会有一些成员没有被初始化,可能就会产生问题。
  3. loadView这个方法是系统默认创建的 因为重写了这个方法导致必须要继承其父类的方法,如果不写继承的loadView,无法继承父系的loadview的创建方法,那么就永远无法创建,那么就会陷入循环。

猜你喜欢

转载自blog.csdn.net/m0_46110288/article/details/108719542