SwiftUI .swipeactions 和核心数据
Posted
技术标签:
【中文标题】SwiftUI .swipeactions 和核心数据【英文标题】:SwiftUI .swipeactions and Core Data 【发布时间】:2021-08-28 13:26:26 【问题描述】:目前使用 Xcode 13 和 ios 15。
我正在使用 CoreData 显示即将到来的旅行列表。在每次旅行中,我有 2 个滑动操作,一个是删除旅行,第二个是编辑旅行。选择编辑按钮时,我将触发显示的题为true,以便显示EditTripeCreen表。我将这次旅行传递到此表中以进行编辑。问题是,无论从 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(item:)
这是一种已知行为
【参考方案1】:
您正在为表格的每个单元格添加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)
)
【讨论】:
感谢您的回复。我试过这个,但我在工作表上遇到错误:无法将类型“Binding以上是关于SwiftUI .swipeactions 和核心数据的主要内容,如果未能解决你的问题,请参考以下文章
为啥 swipeActions 修饰符不能直接与 List 容器一起使用? #SwiftUI
使用 ForEach 中的 SwiftUI 3.0 .swipeActions,您如何在将 ForEach 的输入参数传递给该视图时让一个动作转到另一个视图?