Advertisement

iOS——ViewController的生命周期

阅读量:

引言

本文旨在对UIViewController从产生到消亡的过程进行深入探讨,并以此来明确UIViewController的生命周期。

ViewController

UIViewController作为iOS应用的核心组件,在数据管理和视图交互中扮演关键角色。它不仅负责整合并协调各个功能模块的展示,还通过复杂的逻辑实现不同界面元素之间的无缝切换与交互响应。苹果提供的SDK包含多种标准UIViewController实现,如表视图控制器(UIleep),导航控制器(UINavigationController)以及标签栏控制器($UITabBar)等标准界面组件,并旨在满足开发者对常见界面元素的需求

按结构可以对iOS的所有ViewController分成两类:

  1. 主要用于展示内容的ViewController,这种ViewController主要用于为用户展示内容,并与用户交互,如UITableViewControllerUIViewController
  2. 用于控制和显示其他ViewController的ViewController。这种ViewController一般都是一个ViewController的容器。如UINavigationControllerUITabbarController。它们都有一个属性:viewControllers。其中UINavigationController表示一种Stack式结构,push或pop一个ViewController,后一个ViewController会依赖前一个ViewController。而UITabbarController表示一个Array结构,各个ViewController是并列的。

ViewController的生命周期

请添加图片描述

- (void) awakeFromNib

如果由XIB创建一个view,则该view会执行awfonyloaded方法。这个动作发生在当XIB或storyboard完全加载完毕时。在该状态下,nib文件中的相关对象已完成初始化,并且frame的位置已被固定。

- (void) loadView

用于生成Controller的视图。每当访问controller的view属性(如controller.view或self.view)时,并且该属性值为nil时,loadView方法会被激活。通常情况下,在整个ViewController生命周期中,loadView方法只会被激活一次。

- (void) viewDidLoad

在视图控制器完成对视图层次结构的加载后会触发该操作。无论这些层次结构是通过NIB文件导入还是通过代码方式生成都会导致此操作执行。当开发者在代码中手动创建一个新的视图加载器时,则会在其loadView方法结束后立即被触发;而如果该页面来自NIB文件中的布局设置,则会在布局设置完成后进行相应的处理。

- (void) viewWillAppear:(BOOL)animated

通知视图控制器其视图即将添加到视图层次结构中。

- (void) viewWillLayoutSubViews

通知视图控制器其视图将要布局它的子视图。

- (void) viewDidLayoutSubViews

通知视图控制器其视图已将其子视图布局好。

- (void) viewDidApper:(BOOL)animated

通知视图控制器其视图已经添加到视图层次结构中。

- (void) viewWillDisappear:(BOOL)animated

通知视图控制器其视图将要从视图层次结构中删除。

- (void) viewDidDisappear:(BOOL)animated

通知视图控制器其视图已经从视图层次结构中删除。

- (void) didReceiveMemoryWarning

当应用收到内存警告时会调用此方法。

demo

该应用实现了两套UIViewController的交互:一个是Main\Controller和另一个是Secondary\Controller。在Main\Controller中可以访问Secondary\Controller,在Secondary\Controller中则可以退出Main\Controller。

复制代码
    //ViewController.h
    
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController
    
    @end
复制代码
    //ViewController.m
    
    #import "ViewController.h"
    #import "SecondViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor redColor];
    
    UIButton *presentButton = [UIButton buttonWithType:UIButtonTypeSystem];
    presentButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [presentButton addTarget:self action:@selector(present:) forControlEvents:UIControlEventTouchUpInside];
    [presentButton setTitle:@"跳转" forState:UIControlStateNormal];
    presentButton.frame = CGRectMake(150, 300, 100, 100);
    [self.view addSubview:presentButton];
    
    }
    - (void)present:(UIButton *)button {
    SecondViewController *secondViewController = [[SecondViewController alloc] init];
    secondViewController.modalPresentationStyle = UIModalPresentationFullScreen;
    [self presentViewController:secondViewController animated:YES completion:nil];
    }
    
    @end
复制代码
    //SecondViewController.h
    
    #import <UIKit/UIKit.h>
    
    @interface SecondViewController : UIViewController
    
    @property(nonatomic, strong)UIButton *dismissButton;
    
    @end
复制代码
    //SecondViewController.m
    
    #import "SecondViewController.h"
    
    @interface SecondViewController ()
    
    @end
    
    @implementation SecondViewController
    
    #pragma mark init
    - (instancetype)init{
    self = [super init];
    if(self){
        NSLog(@"%s",__func__);
    }
    return self;
    }
    
    #pragma mark loadView
    - (void)loadView {
    [super loadView];
    
    NSLog(@"%s",__func__);
    }
    
    #pragma mark viewDidLoad
    - (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
    _dismissButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [_dismissButton addTarget:self action:@selector(dismiss:) forControlEvents:UIControlEventTouchUpInside];
    [_dismissButton setTitle:@"返回" forState:UIControlStateNormal];
    _dismissButton.frame = CGRectMake(150, 300, 100, 100);
    [self.view addSubview:_dismissButton];
    
    NSLog(@"%s",__func__);
    }
    
    #pragma mark viewWillLayoutSubviews
    - (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    
    NSLog(@"%s",__func__);
    }
    
    #pragma mark viewDidLayoutSubviews
    - (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    
    NSLog(@"%s",__func__);
    }
    
    
    #pragma mark viewWillAppear:
    - (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    NSLog(@"%s",__func__);
    }
    
    #pragma mark viewDidAppear:
    - (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    
    NSLog(@"%s",__func__);
    }
    
    #pragma mark viewWillDisappear:
    - (void)viewWillDisappear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    NSLog(@"%s",__func__);
    
    }
    
    #pragma mark viewDidDisappear:
    - (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    
    NSLog(@"%s",__func__);
    }
    
    #pragma mark didReceiveMemoryWarning
    - (void)didReceiveMemoryWarning {
    
    NSLog(@"%s",__func__);
    }
    
    - (void)dismiss:(UIButton*)button {
    [self dismissViewControllerAnimated:YES completion:nil];
    }
    
    @end

在SecondViewController中dismiss到ViewController后的运行结果:

请添加图片描述

全部评论 (0)

还没有任何评论哟~