我是 swift 的新手,我有一个 ForEach 列表,显示与 CoreData 一起存储的信息。滑动删除方法适用于列表中显示的每个项目 .onDelete(perform: vm.deleteMemory)
但我想要一个按钮来删除而不是滑动。
这是我到目前为止尝试使用按钮操作的方法,但出现 Cannot convert value of type 'IndexSet.Type' to expected argument type 'IndexSet'
错误。
@StateObject var vm = CoreDataViewModel()
VStack{
Label {
Text("Here is a list of your memories")
.font(.system(size: 25))
.foregroundColor(.primary)
} icon: {
Image(systemName: "hands.sparkles")
.font(.system(size: 25))
}
List {
ForEach(vm.savedEntites) { entity in
Text(entity.name ?? "No Name")
.font(.system(size: 25))
Button(action: { vm.deleteMemory(indexSet: IndexSet)}) {
Label("Delete",systemImage: "trash")
}
}
.onDelete(perform: vm.deleteMemory) //swipe to delete
}
这里是删除功能
func deleteMemory(indexSet: IndexSet) {
withAnimation {
guard let index = indexSet.first else {return}
let entity = savedEntites[index]
container.viewContext.delete(entity)
saveData()
}
答案 0 :(得分:1)
您应该将 deleteMemory 的签名更改为以下内容:
func deleteMemory(entity: Entity) {
----
}
Entity 是您的实体类型。
然后调用 deleteMemory(entity: enttiy)
。
Button(action: { withAnimation {
vm.deleteMemory(entity: entity)
} }) {
Label("Delete",systemImage: "trash")
}
这样做可以避免从 Entity
中的 saveList
检索 deleteMemory
。
ForEach(vm.savedEntites) { entity in
Text(entity.name ?? "No Name")
.font(.system(size: 25))
Button(action: { vm.deleteMemory(entity: entity)}) {
Label("Delete",systemImage: "trash")
}
}
func deleteMemory(entity: Entity) {
withAnimation {
container.viewContext.delete(entity)
saveData()
}
}
但是,我不会在 withAnimation
中使用 deleteMemory
。
ForEach(vm.savedEntites) { entity in
Text(entity.name ?? "No Name")
.font(.system(size: 25))
Button(action: { vm.deleteMemory(entity: entity)}) {
Label("Delete",systemImage: "trash")
}
}
func deleteMemory(entity: Entity) {
container.viewContext.delete(entity)
saveData()
}