【iOS】UIViewController的生命周期

news2024/11/24 2:55:25

文章目录

  • 前言
  • 一、UIViewController生命周期有关函数
  • 二、执行顺序
  • 注意点
    • loadview:


前言

在iOS开发中UIViewController扮演者非常重要的角色,它是视图view和数据model的桥梁,通过UIViewController的管理有条不紊的将数据展示在视图上。作为UIKit中最基本的一个类,一般复杂的项目都离不开UIViewController作为基类。所以了解UIViewController的整个生命周期是有必要的。


一、UIViewController生命周期有关函数

以下是UIViewController生命周期方法的调用函数:

  • init(coder:) 或 init(nibName:bundle:)(根据视图的加载方式而定,可能不会同时调用)

init方法和initCoder方法相似,知识被调用的环境不一样。如果用代码初始化,会调用init方法,从nib文件或者归档(xib、storyboard)进行初始化会调用initCoder。initCoder是NSCoding协议中的方法,NSCoding是负责编码解码,归档处理的协议。

  • loadView():当View需要被展示而它却是nil时,ViewController会调用该方法。
    如果代码维护View的话需要重写此方法,使用xib维护View的话不用重写。
  • viewDidLoad():我们最常用的方法,类成员对象和变量的初始化我们都会放在这个方法中。在创建类后无论视图展现还是消失,这个方法也只会在布局是调用一次。
  • viewWillAppear():是在视图将要展现出来的时候调用。
  • viewDidAppear():方法是视图已经出现。
  • viewWillLayoutSubviews(), viewDidLayoutSubviews():这些方法用于处理视图布局的变化,通常在这里执行与布局相关的操作。viewWillLayoutSubviews()在子视图重新布局之前被调用,而viewDidLayoutSubviews()在子视图重新布局之后被调用。
  • viewWillDisappear():方法是视图即将消失。 -viewDidDisappear():视图已经消失。
  • traitCollectionDidChange()(如果视图控制器的特征集合发生变化)
  • didReceiveMemoryWarning()(如果系统内存不足)

二、执行顺序

我们用一个程序示例来看我们的执行顺序:我们创建AB两个viewcontroller,然后设置一个按钮让他们之间可以进行切换

#import "AViewController.h"
#import "BViewController.h"
@interface AViewController ()

@end

@implementation AViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor redColor];
    _btn1 = [UIButton buttonWithType:UIButtonTypeSystem];
    [_btn1 setTitle:@"next_push" forState:UIControlStateNormal];
    _btn1.frame = CGRectMake(self.view.frame.size.width / 2 - 50, self.view.frame.size.height / 2 - 50, 200, 100);
    [self.view addSubview:_btn1];
    [_btn1 addTarget:self action:@selector(next_present) forControlEvents:UIControlEventTouchUpInside];
}

- (void)next_present {
    BViewController *B = [[BViewController alloc] init];
    NSLog(@"---------A->B---------");
    B.modalPresentationStyle = UIModalPresentationFullScreen;
    [self presentViewController:B animated:YES completion:nil];
}

- (void)loadView {
    [super loadView];
    NSLog(@"%s", __func__);
}

- (void)viewWillAppear:(BOOL)animated {
    NSLog(@"%s", __func__);

}

- (void)viewWillLayoutSubviews {
    NSLog(@"%s", __func__);

}

- (void)viewDidLayoutSubviews {
    NSLog(@"%s", __func__);

}

- (void)viewDidAppear:(BOOL)animated {
    NSLog(@"%s", __func__);

}

- (void)viewWillDisappear:(BOOL)animated {
    NSLog(@"%s", __func__);

}

- (void)viewDidDisappear:(BOOL)animated {
    NSLog(@"%s", __func__);

}
@end
#import "BViewController.h"

@interface BViewController ()

@end

@implementation BViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor greenColor];
    _btn1 = [UIButton buttonWithType:UIButtonTypeSystem];
    [_btn1 setTitle:@"present" forState:UIControlStateNormal];
    _btn1.frame = CGRectMake(self.view.frame.size.width / 2 - 50, self.view.frame.size.height / 2 - 50, 200, 100);
    [self.view addSubview:_btn1];
    [_btn1 addTarget:self action:@selector(next_present) forControlEvents:UIControlEventTouchUpInside];
}

- (void)next_present {
    NSLog(@"---------B->A---------");
    [self dismissViewControllerAnimated:YES completion:nil];
    
}

- (void)loadView {
    [super loadView];
    NSLog(@"%s", __func__);
}

- (void)viewWillAppear:(BOOL)animated {
    NSLog(@"%s", __func__);

}

- (void)viewWillLayoutSubviews {
    NSLog(@"%s", __func__);

}

- (void)viewDidLayoutSubviews {
    NSLog(@"%s", __func__);

}

- (void)viewDidAppear:(BOOL)animated {
    NSLog(@"%s", __func__);

}

- (void)viewWillDisappear:(BOOL)animated {
    NSLog(@"%s", __func__);

}

- (void)viewDidDisappear:(BOOL)animated {
    NSLog(@"%s", __func__);

}
@end

在这里插入图片描述
输出结果:

2023-09-14 19:51:33.418677+0800 viewcontroller[1460:34333] -[AViewController loadView]
2023-09-14 19:51:33.427277+0800 viewcontroller[1460:34333] -[AViewController viewWillAppear:]
2023-09-14 19:51:33.431473+0800 viewcontroller[1460:34333] -[AViewController viewWillLayoutSubviews]
2023-09-14 19:51:33.431545+0800 viewcontroller[1460:34333] -[AViewController viewDidLayoutSubviews]
2023-09-14 19:51:33.471238+0800 viewcontroller[1460:34333] -[AViewController viewDidAppear:]
2023-09-14 19:51:37.265104+0800 viewcontroller[1460:34333] ---------A->B---------
2023-09-14 19:51:37.265809+0800 viewcontroller[1460:34333] -[BViewController loadView]
2023-09-14 19:51:37.271287+0800 viewcontroller[1460:34333] -[AViewController viewWillDisappear:]
2023-09-14 19:51:37.271519+0800 viewcontroller[1460:34333] -[BViewController viewWillAppear:]
2023-09-14 19:51:37.273548+0800 viewcontroller[1460:34333] -[BViewController viewWillLayoutSubviews]
2023-09-14 19:51:37.273784+0800 viewcontroller[1460:34333] -[BViewController viewDidLayoutSubviews]
2023-09-14 19:51:37.778294+0800 viewcontroller[1460:34333] -[BViewController viewDidAppear:]
2023-09-14 19:51:37.778492+0800 viewcontroller[1460:34333] -[AViewController viewDidDisappear:]
2023-09-14 19:51:38.082287+0800 viewcontroller[1460:34333] ---------B->A---------
2023-09-14 19:51:38.085170+0800 viewcontroller[1460:34333] -[BViewController viewWillDisappear:]
2023-09-14 19:51:38.085375+0800 viewcontroller[1460:34333] -[AViewController viewWillAppear:]
2023-09-14 19:51:38.590085+0800 viewcontroller[1460:34333] -[AViewController viewDidAppear:]
2023-09-14 19:51:38.590266+0800 viewcontroller[1460:34333] -[BViewController viewDidDisappear:]
2023-09-14 19:51:38.849236+0800 viewcontroller[1460:34333] ---------A->B---------
2023-09-14 19:51:38.849726+0800 viewcontroller[1460:34333] -[BViewController loadView]
2023-09-14 19:51:38.852811+0800 viewcontroller[1460:34333] -[AViewController viewWillDisappear:]
2023-09-14 19:51:38.853034+0800 viewcontroller[1460:34333] -[BViewController viewWillAppear:]
2023-09-14 19:51:38.854313+0800 viewcontroller[1460:34333] -[BViewController viewWillLayoutSubviews]
2023-09-14 19:51:38.854562+0800 viewcontroller[1460:34333] -[BViewController viewDidLayoutSubviews]
2023-09-14 19:51:39.358408+0800 viewcontroller[1460:34333] -[BViewController viewDidAppear:]
2023-09-14 19:51:39.358612+0800 viewcontroller[1460:34333] -[AViewController viewDidDisappear:]
2023-09-14 19:51:39.548182+0800 viewcontroller[1460:34333] ---------B->A---------
2023-09-14 19:51:39.550289+0800 viewcontroller[1460:34333] -[BViewController viewWillDisappear:]
2023-09-14 19:51:39.550558+0800 viewcontroller[1460:34333] -[AViewController viewWillAppear:]
2023-09-14 19:51:40.055798+0800 viewcontroller[1460:34333] -[AViewController viewDidAppear:]
2023-09-14 19:51:40.056047+0800 viewcontroller[1460:34333] -[BViewController viewDidDisappear:]

由此可以得出我们ViewController的生命周期执行顺序:

  • 当仅仅弹出单个视图控制器
loadView->willAppear->willLayoutsubviews->didLayoutSubviews->didAppear
  • 当两个视图控制器来回切换,我们的第一个视图控制器不会直接调用disAppear函数,而是当第二个视图控制器didAppaer之后才会调用disAppear函数,反之也是如此

注意点

loadview:

每次访问UIViewController的view(比如vc.view、self.view)而且view为nil,loadView方法就会被调用。这也是为什么我们重写loadview方法时必须要加上 [super loadView];,因为调用这个方法可以自动生成我们的view。如果我们找不到view,我们的程序就会一直调用loadview方法来寻找我们的view。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1010013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CRC校验原理及实现

文章目录 前言一、CRC校验原理二、CRC实现1.verilog实现2.模块仿真3.仿真波形前言 现代数据通信要求信息传输具有高度可靠性 ,即误码率要足够低 。 然而 ,数据信号在传输过程中不可避免地会受到噪声干扰 ,或者信道不理想 ,从而造成的码间干扰而产生差错 ,即出现误码。 我…

测试架构师的职责及困境

架构师 架构师来自于建筑学,英文是Architect。建筑工程中的架构师是负责整体建筑的架构设计。因此从宏观上看,软件行业的架构师也类似,是负责整体架构的设计。 在软件工程中架构师是一个团队的技术的领头者。主要工作内容除去对项目的整体设…

基于matlab如何判断闰年方法

一、闰年概念 闰年是历法中的一种年份计算方式,是为了平衡地球的公转时间与我们所使用年份中的关系。在农历中有闰月的年份就是闰年。 普通闰年:公历年份是4的倍数且不是100的倍数为普通闰年(如2004、2020年就是闰年)。 世纪闰…

echarts静态饼图

<div class"cake"><div id"cakeChart"></div></div> import * as echarts from "echarts";mounted() {this.$nextTick(() > {this.getCakeEcharts()})},methods: {// 饼状图getCakeEcharts() {let cakeChart echart…

麒麟v10安装mysql(ARM架构)

下载MYSQL安装包 华为开源镜像站_软件开发服务_华为云 上面的选择一个下载 或者用命令下载 wget https://repo.huaweicloud.com/kunpeng/yum/el/7/aarch64/Packages/database/mysql-5.7.27-1.el7.aarch64.rpm 检查是否已经安装MySQL rpm -qa | grep mysql将包卸载掉 rpm -…

GIS地图服务数据可视化

GIS地图服务数据可视化 OSM&#xff08;Open Street Map&#xff0c;开放街道地图&#xff09;Bing地图&#xff08;必应地图&#xff09;Google地图&#xff08;谷歌地图&#xff09; 地图服务数据可视化是根据调用的地图服务请求Web服务器端的地图数据&#xff0c;实现地图数…

Java经典问题解答(9题)

文章目录 1、通关jwt靶场的其中任意两关&#xff08;该题与Java无关&#xff09;启动环境第4关第5关第7关 2、java是如何跨平台通信的3、java为什么需要类名和文件名一致4、main函数的作用是什么5、.class文件和.java是什么关系6、java在编写函数的时候void是什么意思7、java声…

LLM在电商推荐系统的探索与实践

本文对LLM推荐的结合范式进行了梳理和讨论&#xff0c;并尝试将LLM涌现的能力迁移应用在推荐系统之中&#xff0c;利用LLM的通用知识来辅助推荐&#xff0c;改善推荐效果和用户体验。 背景 电商推荐系统&#xff08;Recommend System&#xff0c;RecSys&#xff09;是一种基于用…

微信小程序与idea后端如何进行数据交互

交互使用的其实就是调用的req.get(url)方法 进行路径访问&#xff0c;你要先保证自己的springboot项目已经成功运行了&#xff1a; 如下&#xff1a; 如何交互的&#xff1f; 微信小程序&#xff1a;如下为index.js页面 在onLoad()事件中调用方法Project.findAllCities() 要…

C++面试记录之中望软件

上次面试体验不好&#xff0c;记录了&#xff0c;这次同样记录一次体验不好的面试&#xff0c;中望软件…直接写了名字&#xff0c;因为真的很无语&#x1f613; 记录一下我不知道的问题 忘记录音了&#x1f622; 1. main函数之前做了什么&#xff1f; 我&#xff1a;实话我…

java使用itext生成pdf

效果&#xff1a; maven依赖 <!--PDF处理--><!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</vers…

SpringMVC:从入门到精通,7篇系列篇带你全面掌握--七.自定义注解

目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Java注解简介 1.原生注解的分类 &#xff08;1&#xff09;JDK基本注解 ①Override ②SuppressWarnings(value "unchecked") &#xff08;2&#xff09;JDK元注解…

Golang goroutine MPG模式浅析

协程是通过使用关键字 go 调用&#xff08;或执行&#xff09;一个函数或者方法来实现的&#xff08;也可以是匿名函数&#xff09;。 Go 语言在语言层面上支持了并发&#xff0c;goroutine是Go语言提供的一种用户态线程&#xff0c;有时我们也称之为协程。 所谓的协程&#x…

Generative Adversarial Nets

Author:龙箬 Computer Application Technology Change the World with Data and Artificial Intelligence ! CSDNweixin_43975035 生命不息&#xff0c;折腾不止 Reference&#xff1a; [1] Goodfellow, I, Pouget-Abadie, J, Mirza, M, Xu, B, Warde-Farley, D, Ozair, S, Co…

《优化接口设计的思路》系列:第一篇—接口参数的一些弯弯绕绕

大家好&#xff01;我是sum墨&#xff0c;一个一线的底层码农&#xff0c;平时喜欢研究和思考一些技术相关的问题并整理成文&#xff0c;限于本人水平&#xff0c;如果文章和代码有表述不当之处&#xff0c;还请不吝赐教。 作为一名从业已达六年的老码农&#xff0c;我的工作主…

PSP - 蛋白质序列提取 Transformer 蛋白质语言模型 ESM2 特征

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132888139 蛋白质语言模型 ESM (Evolutionary Scale Modeling) 是一种利用深度学习技术来预测蛋白质结构和功能的方法。ESM 通过在大规模的蛋白质…

激光雷达检测负障碍物(附大概 C++ 代码)

检测效果如图&#xff0c;红色是正负的障碍物点&#xff1a; 障碍物根据其相对于地面的高度可以分为两类&#xff1a;正向障碍物和负向障碍物。在室外环境中&#xff0c;负障碍物是沟渠、悬崖、洞口或具有陡峭负坡度的地形&#xff0c;可能会造成安全隐患。 不慎通过道路坑洼处…

【电子通识】案例:采用电阻分压式采样电压的设计注意事项

在一些应用中,我们往往采用电阻分压方式来采样外部电压。如文章【Arduino+ESP32专题】案例:简单的实现NTC热敏电阻检测板卡温度中我们就使用一个10K的电阻与NTC电阻形成分压,通过ADC读取到的电压换算成温度值来检测外部环境温度。 当然,比如手持机的电池电压,如果没有一些…

docker-compose 中 depends_on 的作用

文章目录 depends_on 介绍depends_on 有一个长定义模式condition 说明required 说明 参考文档 depends_on 介绍 在 Docker Compose 中&#xff0c;depends_on 是一个用于定义服务之间依赖关系的关键字。它允许您指定一个或多个服务依赖于其他服务&#xff0c;以确保在启动或重…

基于STM32F407ZET6的环境温湿度监控系统(粤嵌GEC-M4)

注意使用事项&#xff1a; 开发板如下 由于外部晶振是8M&#xff0c;需要修改setup和stm32f4头文件的晶振值。 操作如下&#xff1a; system_stm32f4xx.c的254行 #define PLL_M 8stm32f4xx.h的127行 #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the Ex…