渐进式编程课
SwiftUI 目录
第 17 课2026.09.23

用户进入或返回课程页时,及时更新场景保存的导航数据。

第 17 课:导航路径变化时自动保存

  • 日期:2026-09-23
  • 课程序号:第 17 课
  • 知识点:当前 onChange(of:initial:_:) 修改器

用途或适用场景

用户进入或返回课程页时,及时更新场景保存的导航数据。

核心概念

NavigationPath 可比较;当前推荐的零参数 onChange 闭包在路径变化后执行保存。旧的单参数 onChange(of:perform:) 已废弃,不用于本课示例。

最小代码或操作示例

swift
// 沿用第 16 课 LessonView 中的 path、savedPath 和 NavigationStack。
NavigationStack(path: $path) {
    NavigationLink("第 1 课", value: "lesson-1")
        .navigationDestination(for: String.self) { id in Text(id) }
}
.onAppear(perform: restorePath)
.onChange(of: path, initial: false) {
    if let value = path.codable {
        savedPath = try? JSONEncoder().encode(value)
    }
}

3~5 分钟练习

进入“第 1 课”后返回,比较两次 savedPath。

参考答案

进入时保存含一个元素的路径;返回后保存空路径。该值是场景恢复数据,不是长期持久化数据库。

与上一课的联系

沿用第 16 课的 path、savedPath 与 restorePath();本课只新增路径变化后的自动编码保存;完成后下一课可在存储数据损坏时清除无效值。

时效校验

时效校验:2026-09-24(Apple 当前 onChange(of:initial:_:) 与 NavigationPath API;新重载最低 iOS 17 / macOS 14,未废弃;旧 onChange(of:perform:) 已废弃,仅作迁移说明)。

官方参考