SwiftUI 如何基于UUID删除macOS端列表及对应数组中的元素
第一步:修复ID类型不兼容问题
你的代码目前存在类型冲突:NoteItem 声明的id为Int类型,但你选中状态存储、新增笔记时都使用了UUID类型,先统一ID类型:
struct NoteItem: Codable, Hashable, Identifiable { // 将原有Int类型改为UUID let id: UUID var text: String var date = Date() // 补充dateFormatter定义,避免运行报错 private var dateFormatter: DateFormatter { let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") return formatter } var dateText: String { dateFormatter.dateFormat = "EEEE, MMM d yyyy, h:mm a" return dateFormatter.string(from: date) } var tags: [String] = [] }
第二步:实现基于UUID的删除逻辑
不需要拿到完整的选中对象,直接用存储的selectedNoteId匹配数组元素即可,修改removeNote实现:
func removeNote() { // 先判断是否有选中的ID,再匹配数组中对应ID的元素下标 guard let selectedId = selectedNoteId, let index = data.notes.firstIndex(where: { $0.id == selectedId }) else { return } print("delete item: \(index)") data.notes.remove(at: index) }
第三步:绑定删除按钮点击事件
将工具栏中的删除按钮点击事件和上面的方法绑定,还可以增加无选中时的禁用逻辑优化体验:
ToolbarItem(placement: .automatic) { Button(action: removeNote) { Image(systemName: "trash") } // 无选中笔记时禁用删除按钮 .disabled(selectedNoteId == nil) }
修改完成后即可实现基于UUID的列表条目删除,逻辑底层是通过firstIndex(where:)遍历数组匹配UUID一致的元素,拿到下标后直接删除数组对应位置的数据。
内容的提问来源于stack exchange,提问作者Aleph
相关产品推荐
相关产品推荐

