从 coredata SwiftUI 中删除多行
Delete multiple rows from coredata SwiftUI
我正在尝试使用编辑模式下的选择同时删除多个核心数据。但是,该行没有被删除。我不确定是什么问题。
我尝试在 ForEach(notes)
上添加 id:\.id
或 id:\.self
我的代码有什么问题?还有其他删除多行的方法吗?
struct TempNoteView: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(sortDescriptors: [],animation: .default)
private var notes: FetchedResults<Note>
@State var editMode: EditMode = .inactive
@State var selection = Set<UUID>()
var body: some View {
List(selection: $selection) {
ForEach(notes) { note in
NavigationLink(destination: NoteView(note: note)) {
Text(note.name ?? "Untitled")
Spacer()
Button(action: {
if note.pin == false {
note.pin = true
saveContext()
} else {
note.pin = false
saveContext()
}
}) {
if note.pin {
Image("pinned").resizable().frame(width: 23, height: 23, alignment: .center)
.padding(.trailing, 10)
} else {
Image("not-pinned").resizable().frame(width: 23, height: 23, alignment: .center)
.padding(.trailing, 10)
}
}.buttonStyle(PlainButtonStyle())
}
.padding()
.listRowInsets(EdgeInsets())
// .listRowBackground(Color.gray.opacity(0.1))
.background(Color.yellow.opacity(0.3))
.clipShape(RoundedRectangle(cornerRadius: 10))
.listStyle(SidebarListStyle())
.padding(.init(top: 10, leading: 0, bottom: 10, trailing: 0))
}.onDelete(perform: deleteNotes)
}
.environment(\.editMode, self.$editMode)
.navigationTitle("Notes")
.navigationBarItems(
leading:
HStack {
editButton
deleteButton
},
trailing: Button(action: {addNote()}, label: {
Text("Add Note")
Image("plus")
})).onAppear(){
UITableViewCell.appearance().selectionStyle = .none
}
}
private var editButton: some View {
if editMode == .inactive {
return Button(action: {
self.editMode = .active
self.selection = Set<UUID>()
}) {
Text("Edit")
}
}
else {
return Button(action: {
self.editMode = .inactive
self.selection = Set<UUID>()
}) {
Text("Done")
}
}
}
private var deleteButton: some View {
if editMode == .inactive {
return Button(action: {}) {
Image("")
}
} else {
return Button(action: deleteAllNotes) {
Image(systemName: "trash")
}
}
}
private func deleteAllNotes() {
for id in selection {
if let index = notes.lastIndex(where:{ [=10=].id == id }) {
viewContext.delete(notes[index])
}
}
selection = Set<UUID>()
}
func saveContext() {
do {
try viewContext.save()
} catch {
let error = error as NSError
fatalError("Unresolved Error: \(error)")
}
}
private func deleteNotes(offsets: IndexSet) {
withAnimation {
offsets.map { notes[[=10=]] }.forEach(viewContext.delete)
saveContext()
}
}
private func addNote() {
withAnimation {
let newNote = Note(context: viewContext)
newNote.id = UUID()
newNote.name = "New Note"
newNote.createdAt = Date()
newNote.pin = false
saveContext()
}
}
}
将您的 ForEach 更改为
ForEach(notes, id:\.self) { note in
然后将 Set 更改为以 Notes 为类型
@State var selection = Set<Notes>()
然后在您的 deleteAllNotes(我将其重命名为 deleteAllSelectedNotes)中删除所有选定的笔记。
private func deleteAllNotes() {
for item in selection {
viewContext.delete(item)
}
selection = Set<Note>()
}
我正在尝试使用编辑模式下的选择同时删除多个核心数据。但是,该行没有被删除。我不确定是什么问题。
我尝试在 ForEach(notes)
上添加id:\.id
或 id:\.self
我的代码有什么问题?还有其他删除多行的方法吗?
struct TempNoteView: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(sortDescriptors: [],animation: .default)
private var notes: FetchedResults<Note>
@State var editMode: EditMode = .inactive
@State var selection = Set<UUID>()
var body: some View {
List(selection: $selection) {
ForEach(notes) { note in
NavigationLink(destination: NoteView(note: note)) {
Text(note.name ?? "Untitled")
Spacer()
Button(action: {
if note.pin == false {
note.pin = true
saveContext()
} else {
note.pin = false
saveContext()
}
}) {
if note.pin {
Image("pinned").resizable().frame(width: 23, height: 23, alignment: .center)
.padding(.trailing, 10)
} else {
Image("not-pinned").resizable().frame(width: 23, height: 23, alignment: .center)
.padding(.trailing, 10)
}
}.buttonStyle(PlainButtonStyle())
}
.padding()
.listRowInsets(EdgeInsets())
// .listRowBackground(Color.gray.opacity(0.1))
.background(Color.yellow.opacity(0.3))
.clipShape(RoundedRectangle(cornerRadius: 10))
.listStyle(SidebarListStyle())
.padding(.init(top: 10, leading: 0, bottom: 10, trailing: 0))
}.onDelete(perform: deleteNotes)
}
.environment(\.editMode, self.$editMode)
.navigationTitle("Notes")
.navigationBarItems(
leading:
HStack {
editButton
deleteButton
},
trailing: Button(action: {addNote()}, label: {
Text("Add Note")
Image("plus")
})).onAppear(){
UITableViewCell.appearance().selectionStyle = .none
}
}
private var editButton: some View {
if editMode == .inactive {
return Button(action: {
self.editMode = .active
self.selection = Set<UUID>()
}) {
Text("Edit")
}
}
else {
return Button(action: {
self.editMode = .inactive
self.selection = Set<UUID>()
}) {
Text("Done")
}
}
}
private var deleteButton: some View {
if editMode == .inactive {
return Button(action: {}) {
Image("")
}
} else {
return Button(action: deleteAllNotes) {
Image(systemName: "trash")
}
}
}
private func deleteAllNotes() {
for id in selection {
if let index = notes.lastIndex(where:{ [=10=].id == id }) {
viewContext.delete(notes[index])
}
}
selection = Set<UUID>()
}
func saveContext() {
do {
try viewContext.save()
} catch {
let error = error as NSError
fatalError("Unresolved Error: \(error)")
}
}
private func deleteNotes(offsets: IndexSet) {
withAnimation {
offsets.map { notes[[=10=]] }.forEach(viewContext.delete)
saveContext()
}
}
private func addNote() {
withAnimation {
let newNote = Note(context: viewContext)
newNote.id = UUID()
newNote.name = "New Note"
newNote.createdAt = Date()
newNote.pin = false
saveContext()
}
}
}
将您的 ForEach 更改为
ForEach(notes, id:\.self) { note in
然后将 Set 更改为以 Notes 为类型
@State var selection = Set<Notes>()
然后在您的 deleteAllNotes(我将其重命名为 deleteAllSelectedNotes)中删除所有选定的笔记。
private func deleteAllNotes() {
for item in selection {
viewContext.delete(item)
}
selection = Set<Note>()
}