0

目前使用 Xcode 13 和 IOS 15。

我正在使用 CoreData 显示即将到来的旅行列表。在每次旅行中,我有 2 个滑动操作,一个是删除旅行,第二个是编辑旅行。选择“编辑”按钮时,我然后触发显示eDITTRIPSCREEN到TRUE,以便显示“编辑”表格。我正在将行程传递到此表中以进行编辑。问题是无论从 ForEach 行中选择什么行程,发送到 EditTripScreen 的始终是第一个行程数据。我这样做是否正确,或者是他们的另一种解决方案。谢谢

ForEach(tripVM.trips, id: \.id) { trip in
                            TripCardView(trip: trip)
                                .listRowSeparator(.hidden)
                                //.padding(.horizontal)
                            
                                .swipeActions(allowsFullSwipe: false) {
                                            // Edit Trip
                                            Button {
                                               showingEditTripScreen = true
                                                
                                            } label: {
                                                
                                                Label("Edit", systemImage: "pencil.circle.fill")
                                                    
                                            }
                                            
                                            .tint(.green)
                                            
                                            // Delete Trip
                                            Button {
                                                tripVM.deleteTrip(trip: trip)
                                                tripVM.getAllTrips()
                                              
                                            } label: {
                                                Label("Delete", systemImage: "trash.circle.fill")
                                                    
                                            }
                                            .tint(.red)
                                        }
                                .sheet(isPresented: $showingEditTripScreen, onDismiss: {
                                    
                                }, content: {
                                    
                                    EditTripScreen(trip: trip)
                                })
    
                        }
4

1 回答 1

0

您正在sheet为表格的每个单元格添加。因此,当您将showingEditTripScreen变量设置为时true,所有可见视图的工作表都会被触发,并且只会显示其中一个,可能是第一个或只是一个随机的。

相反,您需要存储选定的 trip 和 use sheet(item:onDismiss:content:),这会将您未包装的项目传递给您的内容。这sheet应该是您列表中的一个,不需要将它添加到每个项目中。

也是onDismiss一个可选参数,如果你不使用它,你不需要传递它。当您自动关闭它时editingTrip将设置为。nil

@State
var editingTrip: Trip?

var body: some View {
    ForEach(tripVM.trips, id: \.id) { trip in
        TripCardView(trip: trip)
            .listRowSeparator(.hidden)
            //.padding(.horizontal)
            
            .swipeActions(allowsFullSwipe: false) {
                // Edit Trip
                Button {
                    editingTrip = trip
                } label: {
                    
                    Label("Edit", systemImage: "pencil.circle.fill")
                    
                }
                
                .tint(.green)
                
                // Delete Trip
                Button {
                    tripVM.deleteTrip(trip: trip)
                    tripVM.getAllTrips()
                    
                } label: {
                    Label("Delete", systemImage: "trash.circle.fill")
                    
                }
                .tint(.red)
            }
        
    }
    .sheet(item: $editingTrip, content: { editingTrip in
        EditTripScreen(trip: editingTrip)
    })
}
于 2021-08-28T13:47:31.437 回答