为什么我的目标链接只将最后一个联系人绑定为目标链接的数据?



我正在遍历联系人数组,以便在网格中为每个联系人显示一个单元格。请参阅我的代码:

ForEach($contacts, id: .self) { $contact in
// Creating a grid item for each contact
ContactCell(contact: contact)
.navigationDestination(isPresented: $shouldPresentContactMainView) {
ContactMainView(contact: $contact)
}
.onTapGesture {
shouldPresentContactMainView.toggle()
}
}

奇怪的是,所有网格项都为每个联系人显示正确的单元格。然而,当我点击其中一个时,它会跳转,然后显示数组最后一次接触的数据……不管你点击的是第一个、第二个、第三个网格项目,等等……所有网格项都将segue到ContactMainScreen(这里的数据相同)

为什么不在foreach循环中发送特定联系人的数据?

您需要为每个单元格一个@State,因此将navigationDestination代码添加到ContactCell可以是一种方法。

struct ContactCell: View{
@Binding var contact: Contact
@State var isPresenting: Bool = false
var body: some View{
Text(contact.name)
.navigationDestination(isPresented: $isPresenting) {
ContactMainView(contact: $contact)
}
.onTapGesture {
isPresenting.toggle()
}
}
}

您也可以使用ViewModifier

struct ContactsListView: View {
@State var contacts: [Contact] = (0...10).map { n in
Contact(name: "(n)")
}
var body: some View {
LazyHGrid(rows: Array(repeating: .init(), count: 4)) {
ForEach($contacts, id: .id) { $contact in
// Creating a grid item for each contact
ContactCell(contact: contact)
.modifier(PresentViewModifier(contact: $contact))
}
}
}
}
struct PresentViewModifier: ViewModifier{
@State var isPresenting: Bool = false
@Binding var contact: Contact
func body(content: Content) -> some View {
content
.navigationDestination(isPresented: $isPresenting, destination: {
ContactMainView(contact: $contact)
})
.onTapGesture {
isPresenting.toggle()
}
}
}

最新更新