SwiftUI .swipeactions 和核心数据
SwiftUI .swipeactions and Core Data
目前正在使用 Xcode 13 和 IOS 15。
我正在使用 CoreData 显示即将到来的旅行列表。在每次旅行中,我有 2 个滑动动作,一个是删除旅行,第二个是编辑旅行。选择“编辑”按钮后,我会触发 showingEditTripScreen 为真,以便显示 EditTripScreen sheet。我正在将行程传递到此 sheet 以进行编辑。问题在于,无论从 ForEach 行中选择什么 Trip,它始终是发送到 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)
})
}
您要为 table 的每个单元格添加 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)
})
}
目前正在使用 Xcode 13 和 IOS 15。
我正在使用 CoreData 显示即将到来的旅行列表。在每次旅行中,我有 2 个滑动动作,一个是删除旅行,第二个是编辑旅行。选择“编辑”按钮后,我会触发 showingEditTripScreen 为真,以便显示 EditTripScreen sheet。我正在将行程传递到此 sheet 以进行编辑。问题在于,无论从 ForEach 行中选择什么 Trip,它始终是发送到 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)
})
}
您要为 table 的每个单元格添加 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)
})
}