根据元素 UUID 从列表中删除项目

Deleting an item from a list based on the element UUID

我问这个问题有点尴尬,但经过一天多的尝试,我被卡住了。根据对其他问题的回复,我对代码进行了一些更改。最新代码实质上是根据 UUID 选择列表中的项目。

这导致我的删除功能停止工作,因为我正在处理传递 Int 作为要删除的选定元素。我最初是在实施 like this.

代码如下,我仍在尝试找出解决 SwiftUI 的方法,但问题是,我现在如何根据 UUID 删除列表(及其后面的数组)中的项目,而不是通常选择的项目。

以防万一,这是针对 macOS Big Sur 的。

代码:

struct NoteItem: Codable, Hashable, Identifiable {
    let id: Int
    var text: String
    var date = Date()
    var dateText: String {
        dateFormatter.dateFormat = "EEEE, MMM d yyyy, h:mm a"
        return dateFormatter.string(from: date)
    }
    var tags: [String] = []
}

struct AllNotes: View {
    
    @EnvironmentObject private var data: DataModel
    
    @State var noteText: String = ""
    @State var selectedNoteId: UUID?
    
    var body: some View {
        NavigationView {
            List(data.notes) { note in
                NavigationLink(
                    destination: NoteView(note: note),
                    tag: note.id,
                    selection: $selectedNoteId
                ) {
                    VStack(alignment: .leading) {
                        Text(note.text.components(separatedBy: NSCharacterSet.newlines).first!)
                        Text(note.dateText).font(.body).fontWeight(.light)
                    }
                    .padding(.vertical, 8)
                }
            }
            .listStyle(InsetListStyle())
        }
        .navigationTitle("A title")
        .toolbar {
            ToolbarItem(placement: .navigation) {
                Button(action: {
                    data.notes.append(NoteItem(id: UUID(), text: "New Note", date: Date(), tags: []))
                }) {
                    Image(systemName: "square.and.pencil")
                }
            }

            ToolbarItem(placement: .automatic) {
                Button(action: {
                    // Delete here????
                }) {
                    Image(systemName: "trash")
                }               
            }
        }
        .onAppear {
            DispatchQueue.main.async {
                selectedNoteId = data.notes.first?.id
            }
        }
        .onChange(of: data.notes) { notes in
            if selectedNoteId == nil || !notes.contains(where: { [=10=].id == selectedNoteId }) {
                selectedNoteId = data.notes.first?.id

            }
        }
    }
}

我原来的removeNote是这样的:

func removeNote() {
     if let selection = self.selectedItem,
         let selectionIndex = data.notes.firstIndex(of: selection) {
                print("delete item: \(selectionIndex)")
                data.notes.remove(at: selectionIndex)
         }
}

你能试试这个吗:

struct NoteItem: Codable, Hashable, Identifiable {
    let id: UUID  // <--- here
    var text: String
    var date = Date()
    var dateText: String = ""
    var tags: [String] = []
}

func removeNote() {
    if let selection = selectedNoteId,
       let selectionIndex = data.notes.firstIndex(where: { [=10=].id == selection }) { 
        print("delete item: \(selectionIndex)")
        data.notes.remove(at: selectionIndex)
    }
}