IOS UIView的生命周期的实例详解

IOS UIView的生命周期的实例详解

在iOS开发中,UIView是我们最常用的控件之一。但UIView的生命周期可能并不是每个开发者都完全了解。在本文中,我们将深入探讨UIView的生命周期及其详细解释。

UIView的生命周期及流程

UIView的生命周期是指UIView创建到被销毁的整个过程。UIView的生命周期主要包括以下过程:

  1. Alloc和Init:分配内存并初始化视图对象
  2. LoadView:如果没有从XIB文件中加载视图,则会调用此方法
  3. ViewDidLoad:被加载后调用,但是不要求视图已经在屏幕上渲染
  4. ViewWillAppear:视图将要显示,此时视图层级已经存在,并且即将在屏幕上渲染
  5. ViewDidAppear:视图已经显示在屏幕上,并且用户可以进行交互
  6. ViewWillDisappear:视图将要从屏幕上移除
  7. ViewDidDisappear:视图已经从屏幕上移除

下面是对UIView生命周期各阶段的解释:

Alloc和Init

当我们创建一个UIView对象时,第一步是分配内存并初始化视图对象。这是必须的,我们需要在内存中为对象分配空间,并对其进行初始化。例如,我们可以创建一个UILabel对象,如下所示:

UILabel *label = [[UILabel alloc] init];

LoadView

如果我们在代码中创建一个视图控制器,那么就会自动调用LoadView方法。但是,如果我们使用了Interface Builder(IB)或Storyboard,那么就不会调用LoadView。当视图控制器尝试引用视图层次结构中未加载到内存的视图时,LoadView方法就被调用。

以下是LoadView在代码中的使用示例:

- (void)loadView {
    self.view = [[UIView alloc] init];
    self.view.backgroundColor = [UIColor whiteColor];
}

ViewDidLoad

ViewDidLoad方法表示视图控制器已经完成了视图的加载,并且可以对视图进行按需定制或多个初始化任务。但是,在此方法中不能保证视图已经添加到屏幕上,因此任何关于视图位置或大小的计算可能并不准确。

以下是ViewDidLoad在代码中的使用示例:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

ViewWillAppear

视图将要显示,此时视图层级已经存在,并且即将在屏幕上渲染。ViewWillAppear方法是在视图将要出现时调用的,实质上是静态修改视图。我们可以在该方法中做一些如刷新数据、设置导航栏等方法。

以下是ViewWillAppear在代码中的使用示例:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:NO animated:animated];
}

ViewDidAppear

视图已经显示在屏幕上,并且用户可以进行交互。ViewDidAppear方法是在视图完全展示在屏幕上后调用的。通常我们会在这个方法中做一些如启动定时器、动画效果等方法。

以下是ViewDidAppear在代码中的使用示例:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self startTimer];
}

ViewWillDisappear

视图将要从屏幕上移除。ViewWillDisappear方法是在视图将要从屏幕上移除时调用的。我们可以在该方法中做一些如保存数据、隐藏导航栏等方法。

以下是ViewWillDisappear在代码中的使用示例:

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.navigationController setNavigationBarHidden:YES animated:animated];
}

ViewDidDisappear

视图已经从屏幕上移除。ViewDidDisappear方法是在视图已经从屏幕上移除时调用的。通常我们会在这个方法中做一些如停止定时器、结束动画效果等方法。

以下是ViewDidDisappear在代码中的使用示例:

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    [self stopTimer];
}

实例1:UIView的生命周期

以下是UIView的生命周期流程的代码示例:

@implementation ViewController

- (void)loadView {
    self.view = [[UIView alloc] init];
    self.view.backgroundColor = [UIColor whiteColor];
    NSLog(@"loadView called, view = %@", self.view);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"viewDidLoad called");
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"viewWillAppear called");
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"viewDidAppear called");
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"viewWillDisappear called");
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"viewDidDisappear called");
}

@end

实例2:UIView的懒加载

UIView生命周期的流程中它是需要先初始化,这个时候,系统会给UIView分配内存并对其进行初始化,为了避免多余的内存占用,我们可以考虑将UIView的初始化从viewdidload改到懒加载中。懒加载是在需要使用的时候,才会初始化视图控件,这样可以大大减少内存消耗。

以下是UIView懒加载的代码示例:

- (UIButton *)button {
    if (!_button) {  // 如果button为空,则进行初始化
        _button = [[UIButton alloc] initWithFrame:CGRectMake(20, 100, 300, 50)];
        [_button setTitle:@"Button" forState:UIControlStateNormal];
        [_button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:_button];
    }
    return _button;
}

- (void)buttonTapped:(UIButton *)sender {
    NSLog(@"Button Tapped");
}

以上就是UIView的生命周期及其详细解释,以及两个生动的实例说明,希望能够帮助大家更好地理解UIView的生命周期。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:IOS UIView的生命周期的实例详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Java Spring循环依赖原理与bean的生命周期图文案例详解

    Java Spring是一套开源的JavaEE框架,它的核心是IoC(控制反转)和AOP(面向切面编程)。在Spring中,循环依赖是一个比较重要的概念,本文将详细讲解Java Spring循环依赖原理与bean的生命周期。 什么是循环依赖 在Spring容器中,当Bean A依赖于Bean B,并且Bean B又依赖于Bean A时,我们就称这种情况为循环…

    other 2023年6月27日
    00
  • 使用自定义注解和@Aspect实现责任链模式的组件增强的详细代码

    下面我将详细讲解如何使用自定义注解和@Aspect实现责任链模式的组件增强。 第一步:定义自定义注解 在Java中,使用注解可以将特定的标记附加到类、方法、参数或变量等程序元素上,以便以后进行处理。因此,我们需要先定义一个自定义注解,用于标记需要增强的组件。定义自定义注解的代码如下: @Retention(RetentionPolicy.RUNTIME) @…

    other 2023年6月25日
    00
  • Github如何在Linux系统下创建本地仓库

    Github如何在Linux系统下创建本地仓库 在使用Github进行代码开发过程中,我们通常需要在本地创建一个仓库,并将代码上传到Github服务器上。对于Linux系统用户,创建本地仓库需要进行以下几个步骤: 安装Git 首先需要在Linux系统上安装Git。对于Debian/Ubuntu系统,可以通过以下命令安装: sudo apt-get insta…

    其他 2023年3月28日
    00
  • Java C++题解leetcode817链表组件示例

    下面是Java C++题解leetcode817链表组件的完整攻略: 题目描述 给定链表头结点 head,该链表上的每个结点都有一个唯一的整型值。 同时给定列表 G,该列表是上述链表中整型值的一个子集。 返回列表 G 中组件的个数,这里的组件定义为:链表中一段最长连续节点的值(即链表的子段)在列表 G 中出现次数与该段中节点数目相同。(例如,如果组件中的节点…

    other 2023年6月27日
    00
  • 一文掌握linux性能分析之cpu篇

    以下是关于Linux性能分析之CPU篇的完整攻略: 一文掌握Linux性能分析之CPU篇 在Linux系统中,CPU是系统性能的关键因素之一。本文将介绍如何使用一些工具来分析CPU性能问题。 1. top命令 top命令是一个常用的Linux命令,用于实时监视系统的CPU、内存和进程等信息。在终端中输入top命令,可以看到类似下面的输出: top – 10:…

    other 2023年5月6日
    00
  • 命令行使用支持断点续传的java多线程下载器

    下面是“命令行使用支持断点续传的Java多线程下载器”的完整攻略。 一、需求分析 首先,我们需要明确下载器的需求,即实现在命令行下进行多线程下载,并支持断点续传功能,以提高下载速度和下载成功率。 二、实现过程 1.多线程下载实现 要实现多线程下载,我们需要使用Java中的多线程技术,具体的实现步骤如下: 首先,我们需要确定要下载的文件大小; 然后,根据要下载…

    other 2023年6月26日
    00
  • vue封装axios的几种方法

    下面是“Vue封装Axios的几种方法”的完整攻略: 1. 为什么要封装Axios 在Vue项目中,使用Axios发送请求已经成为了常态。但是如果每次请求都手动编写Axios的代码,将会极大地降低开发效率,并且还容易导致代码重复。因此,我们需要封装Axios的代码,统一管理请求。另外,通过封装,还可以添加统一的请求头、响应拦截器等功能,提高代码的可维护性和安…

    other 2023年6月25日
    00
  • iOS开发之微信聊天工具栏的封装

    iOS开发之微信聊天工具栏的封装攻略 简介 在iOS开发中,设计友好、交互流畅、体验优秀的聊天工具栏是一项非常重要的任务。本文将分享一个针对微信聊天工具栏的封装方案,让你轻松实现高质量的聊天界面。 步骤 步骤1:创建工程 在Xcode中创建一个新的工程,并在项目中添加一个消息界面。 步骤2:设计界面 在消息界面中,创建聊天输入框。这里我们将使用开源框架TPK…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部