SwiftUI .swipeactions and Core Data



当前使用 Xcode 13 和 IOS 15。

我正在使用 CoreData 来显示即将到来的旅行列表。在每次旅行中,我都有 2 个滑动操作,一个用于删除行程,第二个用于编辑行程。当选择"编辑"按钮时,我将触发显示编辑TripScreen为true,以便显示EditTripScreen工作表。我正在将旅行传递到这张要编辑的工作表中。问题是,无论从 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)
})

}

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

相反,您需要存储选定的行程并使用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)
})
}

最新更新