我正在尝试更新一个较旧的应用程序以使用新的 NavigationSplitView 和 NavigationLink,但是当侧边栏具有子对象的层次结构并且我想更新详细 View 时,我试图围绕正确的方法来做这件事来自远处的子物体。例如,基于 WWDC2022 示例项目 Navigation Cookbook,我尝试了以下方法但没有成功:
TestApp.swift
@main
struct TestApp: App {
@StateObject var appState = AppState()
var body: some Scene {
WindowGroup {
NavigationSplitView {
ProjectListView()
} detail: {
if let chapter = appState.chapter {
ChapterDetailView(chapter: chapter)
} else {
Text("Pick a Chapter")
}
}
}
}
}
ChapterListView.swift < A distant (3 levels down) sibling of ProjectListView()
List(selection: $appState.chapter) {
ForEach(chapters) { chapter in
NavigationLink(chapter.title ?? "A Chapter", value: chapter)
}
}
appState.swift
class AppState: ObservableObject {
@Published var chapter: Chapter?
}
我确定我只是不了解新导航方式的基本原理。是的,我的目标是 iOS16
最佳答案
这是 beta 1 中的一个已知错误。要解决此问题,需要将细节部分中的逻辑包装在 ZStack 中。来自发行说明:
NavigationSplitView 列中的条件 View 无法根据某些状态更改进行更新。 (91311311) 解决方法:将列的内容包装在 ZStack 中。如果更改为此,TestApp 将工作:
@main
struct TestApp: App {
@StateObject var appState = AppState()
var body: some Scene {
WindowGroup {
NavigationSplitView {
ProjectListView()
} detail: {
// Wrap in a ZStack to fix this bug
ZStack {
if let chapter = appState.chapter {
ChapterDetailView(chapter: chapter)
} else {
Text("Pick a Chapter")
}
}
}
}
}
}
关于SwiftUI:如何使用 iOS16/iPadOS16 NavigationSplitView 和 NavigationLink 更新远程子项的详细信息列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72586747/