首页 > 其他分享 >视图与视图控制器生命周期

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

时间:2024-06-30 17:24:05浏览次数:22  
标签:控制器 生命周期 自定义 void 视图 调用 super self

在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 {
    // 释放资源
}

参考:

标签:控制器,生命周期,自定义,void,视图,调用,super,self
From: https://www.cnblogs.com/zjq1999/p/18276642

相关文章

  • springmvc的视图
    目录6、springmvc的视图6.1、ThymeleafView6.2、转发视图6.3、重定向视图6.4、视图控制器view-contronller6、springmvc的视图SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户,SpringMVC视图的种类很多,默认有转发视图和重定向视图当工程引入jstl的......
  • 3_3、MFC常用控件用法:列表视图、树型控件和标签
    列表视图、树型和标签1、列表视图控件1.1简介通知消息列表视图控件相关结构体1.2创建CListCtrl类的主要成员函数1.3实例2、树型控件2.1简介通知信息相关数据结构2.2创建CTreeCtrl类的主要成员函数2.3实例3、标签控件3.1简介标签页的通知信息标签控件的相关......
  • Django框架之视图层,form表单文件上传下载,FBV与CBV引入,CBV源码剖析
    ⅠDjango框架之视图层【一】Django的三板斧fromdjango.shortcutsimportHttpResponse,render,redirect,reverse【1】HttpResponse能返回字符串形式的数据HttpResponse是Django中用于创建HTTP响应对象的类,它允许你构建并返回服务器对客户端请求的数据和状态当需......
  • Spring Bean 生命周期详解
    SpringBean生命周期详解在Spring框架中,Bean的生命周期由Spring容器全权管理。了解和掌握Bean的生命周期对于使用Spring开发稳定且高效的应用程序至关重要。本文将详细介绍SpringBean生命周期的五个主要阶段:实例化、属性注入、初始化、使用和销毁,并涵盖各个阶......
  • c++ 多重包含/定义 || 链接性 || 生命周期
     作用域&&生命周期C++中的作用域(scope)指的是变量、函数或其他标识符的可见和可访问的范围。生命周期(Lifetime)指的是变量或对象存在的时间段。它开始于变量或对象的创建(定义)时刻,结束于其被销毁的时刻。作用域:通过其声明的位置来确定。全局作用域:定义在(类/函数)外部......
  • 智能电池充电:使用PID控制器优化SOC(Matlab代码实现)
     ......
  • 生命周期
    生命周期有三种模式:瞬时(Transient)、作用域(Scoped)、单例(Singleton)「瞬时,就是没有生存期。」也就是说,每次从依赖注入系统中获取瞬时的服务实例时,都会创建一个全新的对象。依赖注入系统中的服务容器不会保存它,也就是没有生存权的普通对象。「单例,就是会一直存在,与应用同寿。」也......
  • 「Java开发指南」如何使用Spring注释器实现Spring控制器?(二)
    本教程将引导您使用SpringAnnotator实现Spring控制器,标准Java类被添加到搭建项目中,SpringAnnotatorSpring启用Java类。虽然本教程的重点是Spring控制器,但是SpringAnnotator也可以用于Spring服务、组件和存储库。在本教程中,您将学习如何:创建一个Java类将类配置为Spring控制......
  • 准入控制器(Admission Controller):ResourceQuota,ImagePolicyWebhook
    目录一.系统环境二.前言三.准入控制器简介四.为什么需要准入控制器五.启用/禁用ResourceQuota资源配额5.1查看默认启用/禁用的准入控制器插件5.2ResourceQuota资源配额示例5.3禁用ResourceQuota六.配置ImagePolicyWebhook准入控制器禁止使用后缀为latest的镜像6.1搭建Webhook......
  • MySQL进阶知识之视图、触发器、事务
    【一】MySQL进阶知识之视图【1】视图介绍(1)什么是视图视图就是通过查询得到一张虚拟表,然后保存下来,下次可以直接使用视图也是一张表在计算机科学中,视图(View)是一种虚拟表,其内容是一个或多个基本表的查询结果。视图基于数据库中的数据,通过定义查询语句来构建,并在需要时动......