我有一个列表,它在NavigationView
中的Form
中,每个列表项都有一个可以通过NavigationLink
到达的详细视图。当我向列表中添加新元素时,我希望显示其详细视图。为此,我使用一个@State
变量currentSelection
,将其作为selection
传递给NavigationLink
,并将每个元素的函数作为tag
:
NavigationLink(
destination: DetailView(entry: entry),
tag: entry,
selection: $currentSelection,
label: { Text("The number \(entry)") })
惊奇的是,当列表的元素数量超过屏幕容纳的元素数量时(加上约2个元素),它就停止工作了。问题是:为什么?如何解决?
我制作了一个最小示例来复制这种行为:
import SwiftUI
struct ContentView: View {
@State var entries = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
@State var currentSelection: Int? = nil
var body: some View {
NavigationView {
Form {
ForEach(entries.sorted(), id: \.self) { entry in
NavigationLink(
destination: DetailView(entry: entry),
tag: entry,
selection: $currentSelection,
label: { Text("The number \(entry)") })
}
}
.toolbar {
ToolbarItem(placement: ToolbarItemPlacement.navigationBarLeading) { Button("Add low") {
let newEntry = (entries.min() ?? 1) - 1
entries.insert(newEntry, at: 1)
currentSelection = newEntry
} }
ToolbarItem(placement: ToolbarItemPlacement.navigationBarTrailing) { Button("Add high") {
let newEntry = (entries.max() ?? 50) + 1
entries.append(newEntry)
currentSelection = newEntry
} }
ToolbarItem(placement: ToolbarItemPlacement.bottomBar) {
Text("The current selection is \(String(describing: currentSelection))")
}
}
}
}
}
struct DetailView: View {
let entry: Int
var body: some View {
Text("It's a \(entry)!")
}
}
(通过将列表减少到5个项目并在标签上设置填充:label:{ Text("The number \(entry).padding(30)") }
,我排除了元素数量是核心问题的可能性)
正如您在屏幕录像中所看到的,在达到关键的元素数量之后(无论是在列表前面还是后面添加),底部表仍然显示currentSelection
正在更新,但没有导航。
我使用的是iOS 14.7.1、Xcode 12.5.1和Swift 5。