You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftData批量删除列表选中项时崩溃的问题求助

SwiftData批量删除列表选中项时崩溃的问题求助

Update: 已提交反馈FB12498822

我正在把现有Core Data应用迁移到SwiftData前做技术调研,结果连一个简单的批量删除功能都卡壳了。我的需求很明确:让用户从列表里多选项目,然后点击删除按钮把选中项从数据库中移除。我基于Xcode的SwiftData项目模板开始开发,添加了多选支持和删除按钮,但每次尝试用删除按钮删除选中项时,都会在Item类id属性的@PersistedProperty宏处崩溃,不过通过滑动列表行删除单个项目是完全正常的。

下面是我的代码:

Item.swift

@Model
final class Item {
    var title: String
    var id: String
    
    init(title: String) {
        self.title = title
        self.id = UUID().uuidString
    }
}

extension Item: Identifiable {}

ContentView.swift

struct ContentView: View {
    @Environment(\.modelContext) private var modelContext
    @Query private var items: [Item]
    @State private var selection: Set<Item.ID> = []
    
    var body: some View {
        NavigationView {
            List(selection: $selection) {
                ForEach(items) { item in
                    Text(item.title)
                }
                .onDelete(perform: deleteItems)
            }
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    EditButton()
                }
                ToolbarItem {
                    Button(action: addItem) {
                        Label("Add Item", systemImage: "plus")
                    }
                }
                ToolbarItem {
                    Button(action: deleteSelectedItems) {
                        Label("Delete", systemImage: "trash")
                    }
                }
            }
            Text("Select an item")
        }
    }
    
    private func deleteSelectedItems() {
        selection
            .compactMap { id in
                let predicate = #Predicate<Item> { $0.id == id }
                let descriptor = FetchDescriptor(predicate: predicate)
                let items = try? modelContext.fetch(descriptor)
                return items?.first
            }
            .forEach { modelContext.delete($0) }
    }
    
    private func addItem() {
        withAnimation {
            let newItem = Item(title: "New Item")
            modelContext.insert(newItem)
        }
    }
    
    private func deleteItems(offsets: IndexSet) {
        withAnimation {
            for index in offsets {
                modelContext.delete(items[index])
            }
        }
    }
}

我不确定是自己的实现哪里有问题,还是当前SwiftData beta版本存在bug,希望有经验的朋友能给我指条明路!

备注:内容来源于stack exchange,提问作者Anthony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 11:13:13