渐进式编程课
SwiftUI 目录
第 16 课2026.09.22

同一场景重建后,把上一课保存的页面栈恢复出来。

第 16 课:场景出现时恢复导航路径

  • 日期:2026-09-22
  • 课程序号:第 16 课
  • 知识点:从 @SceneStorage 解码 NavigationPath

用途或适用场景

同一场景重建后,把上一课保存的页面栈恢复出来。

核心概念

场景存储保存的是 Data;先解码为 NavigationPath.CodableRepresentation,再构造 NavigationPath。没有数据或解码失败时保留空路径。

最小代码或操作示例

swift
import SwiftUI

struct LessonView: View {
    @SceneStorage("savedPath") private var savedPath: Data?
    @State private var path = NavigationPath()

    var body: some View {
        NavigationStack(path: $path) {
            NavigationLink("第 1 课", value: "lesson-1")
                .navigationDestination(for: String.self) { id in Text(id) }
        }
        .onAppear(perform: restorePath)
    }

    private func restorePath() {
        guard let savedPath,
              let value = try? JSONDecoder().decode(
                NavigationPath.CodableRepresentation.self, from: savedPath
              ) else { return }
        path = NavigationPath(value)
    }
}

3~5 分钟练习

先让 savedPath 为 nil,再显示页面。

参考答案

restorePath() 直接返回,path 保持空路径,显示根页。

与上一课的联系

沿用第 15 课的 savedPath: Data? 与 path;本课只新增场景出现时的解码恢复;完成后下一课可在路径变化时自动更新保存的数据。

时效校验

时效校验:2026-09-24(Apple 当前 NavigationPath、SceneStorage、onAppear 官方 API;组合示例最低 iOS 16 / macOS 13,未见废弃标记)。

官方参考