在MVC模型中,V指view,负责用户界面的显示、处理用户输入,并将输入传递给控制器。C是指ViewController,充当模型和视图之间的中介。控制器接收用户输入,处理用户请求,并将结果传递给视图以更新显示。本文详细介绍在iOS开发中UIView与UIViewController的生命周期。
UIView
的生命周期
主要包括以下关键阶段:
- 初始化 (
initWithFrame:
orinitWithCoder:
) - 添加到父视图 (
willMoveToSuperview:
ordidMoveToSuperview
) - 布局子视图 (
layoutSubviews
) - 绘制 (
drawRect:
) - 移除父视图 (
willMoveFromSuperview:
ordidMoveFromSuperview
) - 销毁 (
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
的生命周期方法中被调用。例如:
- 在
UIViewController
的viewDidLoad
方法中,视图会被初始化和配置。 - 在
UIViewController
的viewWillAppear:
方法中,视图会被添加到窗口并准备显示。 - 在
UIViewController
的viewWillDisappear:
方法中,视图会从窗口中移除。
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 {
// 释放资源
}
参考:
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容