SwiftUI:如何使用 iOS16/iPadOS16 NavigationSplitView 和 NavigationLink 更新远程子项的详细信息列

标签 swiftui swiftui-navigationlink ios16 swiftui-navigationsplitview ipados16

我正在尝试更新一个较旧的应用程序以使用新的 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/

相关文章:

ios - 为什么 EKEventStore().requestFullAccessToEvents() 适用于模拟器,但不适用于真实设备?

swift - SwiftUI-出现工作表后,无法单击导航栏按钮

swift - 为什么iOS16的NavigationLink被禁用了?

xcode - iOS 16 + 火力地堡 : The app references non-public selectors determineAppInstallationAttributionWithCompletionHandler:

swift - iOS 16,焦点过滤器 API

ios - SwiftUI 披露组文本对齐

dictionary - ListView SwiftUI 的字典数组

ios - 如何在出现时以编程方式触发 NavigationLink

memory-leaks - SwiftUI NavigationLink内存泄漏

ios - 当容器大小发生变化时,考虑到安全区域被忽略,SwiftUI TabView 会失去选择