【问题标题】:NavigationLink inside a List and VStack does not work after the first pop列表中的 NavigationLink 和 VStack 在第一次弹出后不起作用
【发布时间】:2021-10-05 22:17:43
【问题描述】:

我正在尝试在需要列表的最新版本的 SWiftUI 中使用新的“拉取刷新”功能。将 VStack 包含在 List 中会导致 NavigationLink 仅工作一次。下面是没有 Pull To Refresh 部分的代码的简单版本。

在 stackoverflow 上有一个问题被问到 68144891,并且有一个对已知问题链接的引用,该链接将您带到一个未找到的页面 (https://developer.apple.com/documentation/ios-ipados-release-notes/ios-ipados-15-beta-release-notes)

复制步骤

  1. 点按“按我 1”或其中一项
  2. 点按“显示详细信息”
  3. 在顶部点按返回
  4. 再次点击“按我”将不会导航到下一个屏幕。点按时会出现灰屏

该应用无需 VStack 即可运行

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                VStack { // commenting VStack works
                    Text("Options").font(.largeTitle).bold()
                    ForEach(1..<5, id:\.self) { counter in
                        NavigationLink(destination: SubView(counter: counter)) {
                            Text("Press Me \(counter)").font(.headline)
                        }
                        .buttonStyle(PlainButtonStyle())
                    }
                }
            }.listStyle(.grouped)
        }
    }
}

struct SubView: View {
    var counter: Int
    @State private var showDetails = false
    var body: some View {
        VStack(alignment: .leading) {
            Button("Show details") {
                showDetails.toggle()
            }
            
            if showDetails {
                Text("Clicked")
                    .font(.largeTitle)
            }
        }
    }
}

任何帮助表示赞赏

非常感谢!

【问题讨论】:

  • 为什么要在列表中添加“vstack”? “vstack”将整个列表放在一个元素中,这不是您想要的。
  • 我实际上有一个 LazyVStsck 在实际应用程序中带有固定的部分标题。仅作为示例,我使用 VStack 来说明错误。
  • 通过将VStack 添加为List 的根,您将所有内容设置为一行 - 我认为这不是您真正想要做的,所以只需删除VStack 从顶部。顺便说一下,List 已经以惰性方式加载行了。

标签: swift swiftui swiftui-list swiftui-navigationlink swiftui-navigationview


【解决方案1】:

...跟进我的评论

我猜你想要这个

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                Section(Text("Options").font(.largeTitle).bold()) {
                    ForEach(1..<5, id:\.self) { counter in
                        NavigationLink(destination: SubView(counter: counter)) {
                            Text("Press Me \(counter)").font(.headline)
                        }
                        .buttonStyle(PlainButtonStyle())
                    }
                }
            }.listStyle(.grouped)
        }
    }
}

【讨论】:

  • Asperi,感谢您的回复。这在没有固定部分时有效。在我的实际应用程序中,我固定了部分和图表,它们是 LazyVStack 的一部分。我正在尝试实现 IOS15 中引入的 Pull to refresh 功能,这需要我使用 List。因此问题。此外,我正在使用几个已经使用 VStack 的子视图,这将很难重新架构。您认为还有其他选择吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 2015-08-14
  • 2019-11-15
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
相关资源
最近更新 更多