我正在遍历联系人数组,以便在网格中为每个联系人显示一个单元格。请参阅我的代码:
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()
}
}
}