视图与视图控制器生命周期

news/2024/7/2 5:14:55/文章来源:https://www.cnblogs.com/zjq1999/p/18276642

在MVC模型中,V指view,负责用户界面的显示、处理用户输入,并将输入传递给控制器。C是指ViewController,充当模型和视图之间的中介。控制器接收用户输入,处理用户请求,并将结果传递给视图以更新显示。本文详细介绍在iOS开发中UIView与UIViewController的生命周期。

UIView 的生命周期

主要包括以下关键阶段:

  1. 初始化 (initWithFrame: or initWithCoder:)
  2. 添加到父视图 (willMoveToSuperview: or didMoveToSuperview)
  3. 布局子视图 (layoutSubviews)
  4. 绘制 (drawRect:)
  5. 移除父视图 (willMoveFromSuperview: or didMoveFromSuperview)
  6. 销毁 (dealloc)

1. 初始化

initWithFrame:

在代码中创建视图时调用。

- (instancetype)initWithFrame:(CGRect)frame {self = [super initWithFrame:frame];if (self) {// 自定义初始化}return self;
}
initWithCoder:

用于从nib文件或Storyboard中加载视图。这个方法会在视图从接口构建器文件(.xib或.storyboard)解码时调用。参数:NSCoder,用于解码视图属性的解码器对象

- (instancetype)initWithCoder:(NSCoder *)coder {self = [super initWithCoder:coder];if (self) {// 自定义初始化}return self;
}

2. 添加到父视图

willMoveToSuperview:

视图将要被添加到父视图时调用。

- (void)willMoveToSuperview:(UIView *)newSuperview {[super willMoveToSuperview:newSuperview];// 自定义代码
}
didMoveToSuperview

视图已经被添加到父视图时调用。

- (void)didMoveToSuperview {[super didMoveToSuperview];// 自定义代码
}

3. 布局子视图

layoutSubviews

视图的布局发生变化时调用,用于调整子视图的布局。

- (void)layoutSubviews {[super layoutSubviews];// 自定义子视图布局代码
}

4. 绘制

drawRect:

视图需要绘制其内容时调用。这是自定义绘制代码的地方。

- (void)drawRect:(CGRect)rect {// 自定义绘制代码
}

5. 移除父视图

willMoveFromSuperview:

视图将要从父视图中移除时调用。

- (void)willMoveFromSuperview:(UIView *)newSuperview {[super willMoveFromSuperview:newSuperview];// 自定义代码
}
didMoveFromSuperview

视图已经从父视图中移除时调用。

- (void)didMoveFromSuperview {[super didMoveFromSuperview];// 自定义代码
}

6. 销毁

dealloc

视图被销毁时调用,用于释放资源。

- (void)dealloc {// 释放资源
}

视图控制器 (UIViewController) 的生命周期

UIView 与 UIViewController 生命周期的关系

UIView 的生命周期方法通常在 UIViewController 的生命周期方法中被调用。例如:

  • UIViewControllerviewDidLoad 方法中,视图会被初始化和配置。
  • UIViewControllerviewWillAppear: 方法中,视图会被添加到窗口并准备显示。
  • UIViewControllerviewWillDisappear: 方法中,视图会从窗口中移除。

1. init

init 方法是视图控制器的初始化方法。通常用来初始化视图控制器的状态,在这里进行分配内存与初始化实例变量。

- (instancetype)init {self = [super init];if (self) {// 初始化代码}return self;
}

2. loadView

loadView 方法是用于创建视图控制器的视图层次结构的。只有当视图控制器的视图属性被访问且为空时,才会调用这个方法。通常不需要手动重写这个方法,除非需要自定义视图层次结构。

- (void)loadView {// 创建视图层次结构UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];view.backgroundColor = [UIColor whiteColor];self.view = view;
}

3. viewDidLoad

viewDidLoad 方法在视图控制器的视图加载到内存后调用。适合在这里做视图的进一步初始化和配置。通常在这里添加子视图并设置其属性,或者执行一次性初始化任务,如设置标签按钮等UI组件。

- (void)viewDidLoad {[super viewDidLoad];// 视图加载后的初始化self.view.backgroundColor = [UIColor whiteColor];UILabel *label = [[UILabel alloc] initWithFrame:self.view.bounds];label.text = @"Hello, World!";label.textAlignment = NSTextAlignmentCenter;[self.view addSubview:label];
}

4. viewWillAppear:

viewWillAppear: 方法在视图即将被添加到视图层次结构中并显示在屏幕上时调用。适合在这里做视图显示前的准备工作,例如更新视图内容。

- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];// 视图即将显示
}

5. viewDidAppear:

viewDidAppear: 方法在视图已经被添加到视图层次结构中并显示在屏幕上时调用。适合在这里启动需要在视图显示后进行的任务,例如动画和数据加载。

- (void)viewDidAppear:(BOOL)animated {[super viewDidAppear:animated];// 视图已经显示
}

6. viewWillLayoutSubviews

viewWillLayoutSubviews 方法在视图控制器的视图即将布局其子视图时调用。适合在这里更新子视图的布局。

- (void)viewWillLayoutSubviews {[super viewWillLayoutSubviews];// 更新子视图布局
}

7. viewDidLayoutSubviews

viewDidLayoutSubviews 方法在视图控制器的视图已经布局其子视图时调用。适合在这里做布局完成后的调整。

- (void)viewDidLayoutSubviews {[super viewDidLayoutSubviews];// 布局完成后的调整
}

8. viewWillDisappear:

viewWillDisappear: 方法在视图即将从视图层次结构中移除时调用。适合在这里做视图消失前的清理工作。

- (void)viewWillDisappear:(BOOL)animated {[super viewWillDisappear:animated];// 视图即将消失
}

9. viewDidDisappear:

viewDidDisappear: 方法在视图已经从视图层次结构中移除时调用。适合在这里做视图消失后的清理工作。

- (void)viewDidDisappear:(BOOL)animated {[super viewDidDisappear:animated];// 视图已经消失
}

10. dealloc

dealloc 方法在视图控制器被销毁时调用。适合在这里做资源释放和清理工作。

- (void)dealloc {// 释放资源
}

参考:

  • https://www.cnblogs.com/CoderWayne/p/3868535.html

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS2022 csproject文件增加发布时文件项

发布时新加的node_modules 总是不会伴随着其他文件一起发布到文件夹里面。一个一个添加选项太麻烦了。百度查询后发现可以通过修改csproject 把node_modules //添加节点即可 <ItemGroup> <Content Include="wwwroot\assets\node_modules\**"> <C…

【OHSAS 18001标准制定方】

OHSAS 18001标准的制定方是多个国际标准机构和专业组织合作的结果。这一标准是在1999年由英国标准协会(British Standards Institution, BSI)联合全球多个标准制定机构、认证机构与专业组织共同发展的。OHSAS 18001标准的制定考虑了与ISO 9001(质量管理体系)和ISO 14001(环…

Django - admin list_filter 自定义过滤器

from django.contrib import admin from django.contrib.admin import SimpleListFilterclass MyStatusFilter(SimpleListFilter):# 设置过滤标题title = "订单状态"# 设置自定义过滤字段parameter_name = status2# 显示筛选条件def lookups(self, request, model_ad…

DST Server搭建

DST Server(饥荒服务器搭建)方法介绍 论坛上的方法我看了试过了,然后我分析了他这个运行脚本以及偷懒去直接挪用了客户端创建的本地世界存档。这个文档之前在B的专栏上写过,但是切换编辑器新旧版的时候内容直接删除了。 涉及的目录和文件有: /home/lion/.local/share/Steam/…

.net6 prism wpf 使用halcon导出函数

1、halcon导出函数read_image(Image, 1.png) get_image_size (Image, Width, Height) dev_open_window (0, 0, Width-500, Height-500, black, WindowHandle) dev_display (Image) 2、使用导出的C#代码 4、修改导出的 cs程序1、HObject修改为公开属性2、封装Dispose函数 5、wp…

喜报 | 极限科技获得北京市“创新型”中小企业资格认证

2024年6月20日,北京市经济和信息化局正式发布《关于对2024年度4月份北京市创新型中小企业名单进行公告的通知》,极限数据(北京)科技有限公司凭借其出色的创新能力和卓越的企业实力,成功获得“北京市创新型中小企业”的殊荣。北京市“创新型中小企业”的殊荣,是对极限数据…

【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练

一、介绍 乐器识别系统。使用Python为主要编程语言,基于人工智能框架库TensorFlow搭建ResNet50卷积神经网络算法,通过对30种乐器(迪吉里杜管, 铃鼓, 木琴, 手风琴, 阿尔卑斯号角, 风笛, 班卓琴, 邦戈鼓, 卡萨巴, 响板, 单簧管, 古钢琴, 手风琴(六角形), 鼓, 扬琴, 长笛, 刮…

简书屏蔽Firefox,无法访问jianshu.io 图片

最近使用Firefox 访问简书时发现,简书页面中的图片均无法显示(事发时是在2024年六月份)。 通过查看Firefox“开发者工具”(“工具”-> "浏览器工具"->"web开发者工具")的Console和Network发现很多403错误,这些错误均是在访问jianshu.io时出现(…

Revel:Go语言中比Gin更好用的Web框架

Revel:Go语言中比Gin更好用的Web框架 原创 K8sCat 源自开发者 2024-05-28 23:54 广东 2人听过源自开发者 专注于提供关于Go语言的实用教程、案例分析、最新趋势,以及云原生技术的深度解析和实践经验分享。 259篇原创内容公众号在众多的Golang Web框架中,Revel以其全栈特性脱…

Maven下载、安装与配置

Maven下载、安装与配置下载 Maven 1、进入 Maven官方下载地址 2、点击 Download,再点击 Maven 3 archives,查看 3.x.x 版本的 Maven3、点击 3.9.6 文件夹(对应版本号),再点击 binaries 文件夹,点击下载 apache-maven-3.9.6-bin.zipbinaries:可执行版,是已经编译好的版本…

典型性相关分析在SPSS中的实现

典型性相关分析是研究两组变量(每组变量中都可能有多个指标)之间相关关系的一种多元统计方法。它能够揭示出两组变量之间的内在联系。 本文着重模型在spss中的应用,通过一道例题解释各个指标的意义。详细推导过程请选修课程《多元统计分析》 目录一、问题提出二、利用SPSS进…

PTA7-8次作业

Blog1.前言: 第七次作业是在第六次作业基础上的拓展,新增互斥开关与受控窗帘(要求:互斥开关有3个引脚:1个是汇总引脚,另两个是分支引脚。开关电路示意图如图1所示,左边是汇总引脚,编号为1;右边两个是分支引脚,右上的输出引脚为2,右下输出引脚为3。图中1、2、3引脚均…

.net6 prism wpf 8.1使用 halcondotnet 17.12程序集

1、找到安装目录下的halcondotnet.dll 2、自己新增dlls离线程序集合文件夹 3、放入halcondotnet.dll 4、wpf程序右键引用dll 5、报错 System.Drawing.Common问题nuget安装包 System.Drawing.Common 6、wpf使用halcondotnet.dll 程序集 <UserControl x:Class="Halcon…

表格结构转换(Filter+ToRow)

问题:一维表转成二维表,重复的内容横向展开 函数公式解决:=TOROW(FILTER(B$2:C$7,A$2:A$7=E2))

VAE生成人脸代码

基于VAE介绍的理论,简单实现VAE生成人脸,代码如下: utils.pyimport os from torch.utils.data import Dataset from torchvision.transforms import transforms import glob import cv2 import numpy as np import torchclass MyDataset(Dataset):def __init__(self, img_pa…

ret2shellcode

参考链接 :基本 ROP - CTF Wiki (ctf-wiki.org) 参考链接: https://www.freebuf.com/vuls/266711.html 参考链接:PWN入门(2-2-1)-栈迁移(x86) (yuque.com)介绍栈溢出漏洞的一种利用方式,通过向可写入可执行内存写入shellcode,并利用栈溢出漏洞将返回地址覆盖为shellco…

判断存在与否

问题:A、B两个表,在B表中判断其中数据在A表是否存在。 函数公式解决: =COUNTIF(A!A:A,A2)

有点难以描述的问题(转列+排序+去重)

问题: 以下数据起始值为0,与0同行的2在数据源中有重复,则取与之重复的2的同行数据即6,6在数据源中仍有重复,再取与之重复的6的同行数据8,8在数据源中没有重复,则为第一行第二列的结果。 以此类推。函数公式解决:=WRAPROWS(UNIQUE(SORT(TOCOL(A3:B8)),,1),2) 先用ToCal…

outside_的第三次博客作业

outside_的第三次博客作业 --Wenxiaowenyy 前言: 这次博客是本学期的最后一次博客,也是大一的最后篇博客,回顾这学期学习java的热情以及完成大作业的积极性比起学c语言的时候减少了许多,原因有很多,其一是自己变懒惰了,其二是这学期的java比起上学期的c语言的确难度增加了…

最大值减不为0的最小值

问题:一列中的最大值减去不为0的最小数(所有数据均为正数) 函数公式解决:=MAX(B4:B7)-MINIFS(B4:B7,B4:B7,">0")如果数据有正有负,则需要用MaxIfs减去MinIfs,MaxIfs与MinIfs用法相同。