[英]SwiftUI NavigationLink in the list doesn't get the right detail page with isActive
如果按任何单元格,我只想简单地从List
导航到详细信息页面。 我有一个这样的列表:
当我单击单元格c
时,它会得到d
或其他。 而不是这个页面。
这是我的代码:
struct ContentView: View {
var items = ["a", "b", "c", "d"]
@State var isCellSelected = false
var body: some View {
NavigationView {
List {
ForEach(items.indices, id: \.self) { index in
NavigationLink(
destination: Text("\(items[index])"),
isActive: $isCellSelected,
label: {
RowView(text: items[index])
})
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
struct RowView: View {
var text: String
var body: some View {
VStack {
Text(text)
}
}
}
如果我删除isActive: $isCellSelected
然后它按预期工作。 我需要使用 isCellSelected 弹回根视图。 不知道如何解决这个问题。
有什么帮助吗? 谢谢!
编辑
更新删除isActive
并尝试设置selection = nil
truct DetailView: View {
var text: String
@Binding var isCellSelected: Int?
var body: some View {
VStack {
Text(text)
Button("Back") {
isCellSelected = nil
}
}
}
}
struct ContentView: View {
var items = ["a", "b", "c", "d"]
@State var selectedTag: Int? = nil
var body: some View {
NavigationView {
List {
ForEach(items.indices, id: \.self) { index in
NavigationLink(
destination: DetailView(text: "\(items[index])", isCellSelected: $selectedTag),
tag: index,
selection: $selectedTag,
label: {
RowView(text: items[index])
})
}
}
}
}
}
当按下Back
按钮时,go 不会返回。
不建议在多个NavigationLink
之间共享单个isActive
state。
为什么不使用selection
而不是isActive
?
struct ContentView: View {
var items = ["a", "b", "c", "d"]
@State var selectedTag: Int? = nil //<-
var body: some View {
NavigationView {
List {
ForEach(items.indices, id: \.self) { index in
NavigationLink(
destination: Text("\(items[index])"),
tag: index, //<-
selection: $selectedTag, //<-
label: {
RowView(text: items[index])
})
}
}
}
}
}
您可以将 似乎nil
设置为selectedTag
以弹回。List
中的NavigationLink
无法按我的预期工作。 寻找解决方法并在找到时进行更新。
一个肮脏的解决方法:
(用 Xcode 12.3/iPhone 模拟器 14.3 测试。请不要指望这适用于 iOS 的其他版本,包括未来版本。)
struct DetailView: View {
var text: String
@Binding var isCellSelected: Bool
var body: some View {
VStack {
Text(text)
Button("Back") {
isCellSelected = false
}
}
}
}
struct Item {
var text: String
var isActive: Bool = false
}
struct ContentView: View {
@State var items = ["a", "b", "c", "d"].map {Item(text: $0)}
@State var listId: Bool = false //<-
var body: some View {
// Text(items.description) // for debugging
NavigationView {
List {
ForEach(items.indices) { index in
NavigationLink(
destination:
DetailView(text: "\(items[index].text)",
isCellSelected: $items[index].isActive)
.onAppear{ listId.toggle() } //<-
,
isActive: $items[index].isActive,
label: {
RowView(text: items[index].text)
})
}
}
.id(listId) //<-
}
}
}
另一种解决方法:
struct DetailView: View {
var text: String
@Binding var isCellSelected: Int?
var body: some View {
VStack {
Text(text)
Button("Back") {
isCellSelected = nil
}
}
}
}
struct ContentView: View {
var items = ["a", "b", "c", "d"]
@State var selectedTag: Int? = nil
var body: some View {
NavigationView {
ZStack {
ForEach(items.indices) { index in
NavigationLink(
destination:
DetailView(text: "\(items[index])",
isCellSelected: $selectedTag),
tag: index,
selection: $selectedTag,
label: {
EmptyView()
})
}
List {
ForEach(items.indices) { index in
Button(action: {
selectedTag = index
}) {
HStack {
RowView(text: items[index])
Spacer()
Image(systemName: "chevron.right")
.foregroundColor(Color.secondary)
}
}
}
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.