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日

相关文章

  • 易语言将指定的主机名与IP地址转换功能

    易语言将指定的主机名与IP地址转换功能攻略 简介 易语言是一种面向中文编程的高级编程语言,它提供了一些方便的网络编程功能,包括将主机名与IP地址进行转换的功能。这个功能可以帮助我们在网络编程中快速获取主机名对应的IP地址,或者获取IP地址对应的主机名。 步骤 步骤一:导入网络编程模块 首先,我们需要导入易语言的网络编程模块,以便使用其中的函数和方法。在易语言…

    other 2023年7月30日
    00
  • Android编程设计模式之模板方法模式详解

    Android编程设计模式之模板方法模式详解 什么是模板方法模式? 模板方法模式是一种行为型设计模式,它定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法的结构下,重定义算法的某些步骤。 模板方法模式的实现方式 在 Android 中,模板方法模式实现方式分为两类:基于抽象类的模板方法模式和基于接口的模板方法模式。 基于抽象类的模…

    other 2023年6月27日
    00
  • win10正式版怎么激活?win10正式版激活工具下载地址

    Win10正式版激活攻略 激活Windows 10正式版是确保您的操作系统合法使用的重要步骤。以下是一个详细的攻略,包括两个示例说明,以帮助您完成激活过程。 步骤1:使用产品密钥激活 首先,您需要获得一个有效的Windows 10产品密钥。您可以在购买Windows 10时获得密钥,或者如果您已经购买了Windows 10,可以在产品包装盒或电子邮件中找到密…

    other 2023年8月4日
    00
  • 联想ThinkPad笔记本如何添加系统环境变量?

    以下是详细的攻略: 联想ThinkPad笔记本如何添加系统环境变量? 什么是系统环境变量? 在计算机操作系统(如Windows)中,环境变量是一组动态的值,它们可被操作系统或其他应用程序使用。系统环境变量是定义了操作系统的行为的变量,它们对整个系统生效,包括所有用户和应用程序的执行。添加系统环境变量可改变系统范围内的默认值,从而对系统的所有用户生效。 通常,…

    other 2023年6月27日
    00
  • Spring Boot 实现配置文件加解密原理

    1. Spring Boot 配置文件加解密原理简介 配置文件中包含了应用程序的敏感信息,因此常常需要进行加密处理,确保这些信息能够安全地存储和传输。Spring Boot提供了多种方式对配置文件进行加密和解密操作,其原理就是利用了加密算法,对敏感信息进行加密处理,从而保护配置文件中的信息。 Spring Boot支持多种加密方式,包括对称加密、非对称加密、…

    other 2023年6月25日
    00
  • Java实现双端链表LinkedList

    Java实现双端链表LinkedList的完整攻略 双端链表LinkedList介绍 双端链表LinkedList是链表的一种,除了拥有节点指向下一个节点的指针外,还拥有指向上一个节点的指针,这样可以双向遍历链表。常用的操作包括插入、删除、获取和遍历。 实现步骤 1. 定义节点类 节点类用来表示链表的一个节点,包含节点的值(value)、下一个节点(next…

    other 2023年6月27日
    00
  • 关于uniapp的picker的使用

    关于uniapp的picker的使用攻略 1. 了解picker组件 picker组件是uniapp中的一个基础组件,用于从一组数据中选择一个或多个值。组件可以用于选择日期、时间、省市区等信息。picker组件的使用需要提供数据源和事件处理函数。 2. 使用picker组件 以下是一个使用picker组件的示例: <template> <v…

    other 2023年5月7日
    00
  • C++教程之变量的作用域与生命周期详解

    C++教程之变量的作用域与生命周期详解 简介 本文将详细讲解C++变量的作用域和生命周期,帮助初学者理解C++中变量的特点和使用方法。 变量的作用域 变量的作用域指的是变量生效的范围。C++中变量的作用域有局部作用域和全局作用域两种。 局部作用域 局部作用域指的是变量只在定义它的语句块内有效。在局部作用域外,变量不可见,也不能访问。例如: void test…

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