【iOS】UIViewController的生命周期

UIViewController 是 iOS 应用开发中的核心类之一。它负责管理视图层次结构并处理用户交互。理解 UIViewController 的生命周期对于构建稳定且高效的应用程序至关重要。本篇文章将详细介绍 UIViewController 的生命周期,包括其主要方法、生命周期中的状态变化以及实际应用中的案例和场景。

1. UIViewController生命周期概述

UIViewController 的生命周期是指一个视图控制器从创建到销毁的过程。在这个过程中,视图控制器会经历多个状态,并调用相应的方法来处理这些状态变化。

1.1 生命周期方法概述

以下是 UIViewController 生命周期中常用的方法:

  • init(coder:)
  • init(nibName:bundle:)
  • loadView
  • viewDidLoad
  • viewWillAppear(_:)
  • viewDidAppear(_:)
  • viewWillDisappear(_:)
  • viewDidDisappear(_:)
  • deinit

每个方法在生命周期中的不同阶段被调用,理解它们的作用和调用时机对于有效地管理视图控制器至关重要。

2. 生命周期方法详细说明

2.1 init(coder:)

swiftCopy Code
init?(coder: NSCoder)

这个初始化方法在使用 Interface Builder 进行布局时调用。它会被调用来解码存档文件中保存的视图控制器的信息。

示例:

swiftCopy Code
required init?(coder: NSCoder) { super.init(coder: coder) // Custom initialization }

2.2 init(nibName:bundle:)

swiftCopy Code
init(nibName: String?, bundle: Bundle?)

这个初始化方法用于从 nib 文件创建视图控制器。nibName 参数是 nib 文件的名称,bundle 参数是包含 nib 文件的 bundle。

示例:

swiftCopy Code
init(nibName: String?, bundle: Bundle?) { super.init(nibName: nibName, bundle: bundle) // Custom initialization }

2.3 loadView

swiftCopy Code
override func loadView() { super.loadView() // Custom view setup }

loadView 方法在视图控制器的视图对象尚未加载到内存时被调用。通常情况下,不需要重写这个方法,除非你需要自定义视图加载过程。默认情况下,UIViewController 会从 nib 文件或 storyboard 中加载视图。

2.4 viewDidLoad

swiftCopy Code
override func viewDidLoad() { super.viewDidLoad() // View did load setup }

viewDidLoad 方法在视图加载到内存后被调用。此时视图的框架已经配置完成,可以在这里进行视图的初始化设置,例如设置数据源、配置 UI 元素等。

示例:

swiftCopy Code
override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white setupUI() } private func setupUI() { // UI setup code }

2.5 viewWillAppear(_:)

swiftCopy Code
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // View will appear setup }

viewWillAppear(_:) 方法在视图将要出现在屏幕上之前调用。你可以在这里做一些准备工作,比如更新 UI 或者启动动画。

示例:

swiftCopy Code
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // Prepare data before view appears }

2.6 viewDidAppear(_:)

swiftCopy Code
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // View did appear setup }

viewDidAppear(_:) 方法在视图已经出现在屏幕上之后调用。通常用来启动动画或进行其他需要视图已完全显示的操作。

示例:

swiftCopy Code
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // Start animations or perform actions }

2.7 viewWillDisappear(_:)

swiftCopy Code
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // View will disappear setup }

viewWillDisappear(_:) 方法在视图将要从屏幕上消失之前调用。你可以在这里取消正在进行的动画或保存数据。

示例:

swiftCopy Code
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // Save data or cancel ongoing tasks }

2.8 viewDidDisappear(_:)

swiftCopy Code
override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) // View did disappear setup }

viewDidDisappear(_:) 方法在视图已经从屏幕上消失之后调用。可以在这里清理资源或执行后续操作。

示例:

swiftCopy Code
override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) // Cleanup or perform actions after view disappears }

2.9 deinit

swiftCopy Code
deinit { // Cleanup }

deinit 方法在视图控制器被销毁之前调用。在这里你可以释放任何资源,避免内存泄漏。

示例:

swiftCopy Code
deinit { // Perform cleanup tasks }

3. 生命周期中的状态变化

3.1 创建和初始化

在视图控制器的创建和初始化阶段,init(coder:)init(nibName:bundle:) 方法会被调用。此时视图控制器对象已经被创建,但视图还没有被加载。

3.2 视图加载

当视图控制器的视图需要加载时,loadView 方法会被调用。这是视图控制器加载其视图层次结构的关键阶段。

3.3 视图出现

在视图即将显示到屏幕上时,viewWillAppear(_:) 被调用。视图控制器可以在这个阶段进行必要的更新,例如更新 UI 或加载数据。视图完全出现后,viewDidAppear(_:) 会被调用,通常用来启动动画或进行其他操作。

3.4 视图消失

当视图即将消失时,viewWillDisappear(_:) 被调用。你可以在这里做一些清理工作或者保存数据。视图完全消失后,viewDidDisappear(_:) 会被调用,适合用来取消动画或释放资源。

3.5 销毁

当视图控制器被销毁时,deinit 方法会被调用。此时,你可以执行最后的清理操作。

4. 实际应用中的案例和场景

4.1 示例场景:数据加载和更新

在实际应用中,你可能会需要根据视图控制器的生命周期状态来加载数据。例如,你可能在 viewDidLoad 方法中加载数据,而在 viewWillAppear(_:) 方法中更新视图。

示例代码:

swiftCopy Code
class MyViewController: UIViewController { var data: [String] = [] override func viewDidLoad() { super.viewDidLoad() loadData() } private func loadData() { // Load data from a source data = ["Item 1", "Item 2", "Item 3"] } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) updateUI() } private func updateUI() { // Update UI elements with the latest data print(data) } }

4.2 示例场景:动画控制

动画控制通常需要在视图完全显示或消失后进行。因此,你可能会在 viewDidAppear(_:)viewDidDisappear(_:) 方法中启动或停止动画。

示例代码:

swiftCopy Code
class AnimatedViewController: UIViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) startAnimation() } private func startAnimation() { // Start an animation UIView.animate(withDuration: 0.5) { // Animation code } } override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) stopAnimation() } private func stopAnimation() { // Stop the animation } }

4.3 示例场景:保存用户输入

在用户输入数据的场景下,你可能需要在视图即将消失时保存用户的输入。

示例代码:

swiftCopy Code
class FormViewController: UIViewController { var userInput: String = "" override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) saveUserInput() } private func saveUserInput() { // Save the user input UserDefaults.standard.set(userInput, forKey: "UserInput") } }

4.4 示例场景:资源管理