理解 iOS Navigation Controller 的生命周期

在 iOS 开发中,UINavigationController 是一种流行的视图控制器容器,用于在堆栈中管理多个视图控制器的显示。理解 Navigation Controller 的生命周期对构建流畅和高效的用户体验至关重要。本文将详细介绍其生命周期的不同步骤、每个步骤的代码示例及相关的注释,以帮助初学者更好地掌握这一概念。

流程步骤

以下是 iOS Navigation Controller 生命周期的主要步骤:

步骤 描述
1. 创建 Navigation Controller 初始化 Navigation Controller 和相关的根视图控制器
2. 推入新的视图控制器 使用 pushViewController:animated: 方法将新的视图控制器推入堆栈
3. 弹出当前视图控制器 使用 popViewController(animated:) 方法返回上一个视图控制器
4. 处理 ViewDidLoad 每个视图控制器的 viewDidLoad 方法在视图加载时调用
5. 处理 ViewWillAppear 每个视图控制器的 viewWillAppear 方法在视图即将显示前调用
6. 处理 ViewDidAppear 每个视图控制器的 viewDidAppear 方法在视图显示后调用
7. 处理 ViewWillDisappear 每个视图控制器的 viewWillDisappear 方法在视图即将消失前调用
8. 处理 ViewDidDisappear 每个视图控制器的 viewDidDisappear 方法在视图消失后调用

每一步的实现

1. 创建 Navigation Controller

在应用程序中通常会在 AppDelegate 中设置 Navigation Controller:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        window = UIWindow()
        let rootViewController = RootViewController() // 根视图控制器
        let navigationController = UINavigationController(rootViewController: rootViewController)
        window?.rootViewController = navigationController
        window?.makeKeyAndVisible()
        return true
    }
}
  • window: 应用窗口。
  • UINavigationController: 创建导航控制器并传入根视图控制器。

2. 推入新的视图控制器

例如,从根视图控制器中推入新视图控制器:

class RootViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let button = UIButton(type: .system)
        button.setTitle("Push New View", for: .normal)
        button.addTarget(self, action: #selector(pushNewView), for: .touchUpInside)
        view.addSubview(button)
    }

    @objc func pushNewView() {
        let newViewController = NewViewController() // 新视图控制器
        navigationController?.pushViewController(newViewController, animated: true) // 推入新视图
    }
}
  • UIButton: 按钮触发操作。
  • pushViewController: 将新视图控制器推入堆栈。

3. 弹出当前视图控制器

在新视图控制器中,可以加一个按钮来返回:

class NewViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let button = UIButton(type: .system)
        button.setTitle("Go Back", for: .normal)
        button.addTarget(self, action: #selector(goBack), for: .touchUpInside)
        view.addSubview(button)
    }

    @objc func goBack() {
        navigationController?.popViewController(animated: true) // 返回上一个视图
    }
}
  • popViewController: 弹出当前视图控制器。

4. 处理生命周期事件

当然,你还需要实现视图的生命周期方法,如下:

override func viewDidLoad() {
    super.viewDidLoad()
    print("View is loaded!")
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print("View will appear!")
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    print("View did appear!")
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    print("View will disappear!")
}

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    print("View did disappear!")
}
  • viewWillAppear: 在视图即将出现时调用。
  • viewDidAppear: 在视图完全出现后调用。

甘特图

以下是 iOS Navigation Controller 生命周期的甘特图,用于展示各步骤的时间进度:

gantt
    title iOS Navigation Controller 生命周期
    dateFormat  YYYY-MM-DD
    section 创建 Navigation Controller
    创建: 2023-10-01, 1d
    section 推入新视图控制器
    推入: 2023-10-02, 1d
    section 弹出当前视图控制器
    弹出: 2023-10-03, 1d
    section 生命周期方法处理
    处理: 2023-10-04, 3d

旅行图

以下是 iOS Navigation Controller 生命周期的旅行图,展示用户的导航路径:

journey
    title 用户访问 Navigation Controller
    section 访问根视图控制器
      用户点击按钮: 5: 根视图控制器->新视图控制器
    section 返回
      用户点击返回按钮: 5: 新视图控制器->根视图控制器

结尾

通过以上步骤,您现在应该能够理解 iOS Navigation Controller 的生命周期及其工作机制。掌握这些基本概念,将为您后续的 iOS 开发打下良好的基础。继续探索更复杂的特性和功能将有助于您成为一名出色的开发者。如果您对 Navigation Controller 或其他 iOS 开发概念有任何疑问,请随时询问!