SwiftUI中删除List列表条目的正确方法及对应闭包放置位置
SwiftUI List 列表条目删除实现方案
核心实现逻辑
- 要实现List条目删除,需要在
ForEach容器上添加onDelete(perform:)修饰符,该修饰符接收处理删除逻辑的方法/闭包作为参数 - 删除操作的处理逻辑需要单独实现,接收
IndexSet类型的入参,对应要删除条目的下标集合 - 删除闭包/方法必须绑定到List内部的ForEach实例上,不能直接绑定到List容器本身,否则功能无法生效
适配Core Data场景的修改示例
首先在视图中新增删除处理方法,放在body属性外部:
private func deleteReminder(at offsets: IndexSet) { guard let reminders = category.reminders?.allObjects as? [Reminder] else { return } // 遍历要删除的下标,移除对应的Core Data数据 offsets.forEach { index in let reminderToDelete = reminders[index] category.removeFromReminders(reminderToDelete) } // 保存Core Data上下文,持久化删除操作 do { try PersistenceController.shared.container.viewContext.save() } catch { print("删除操作保存失败: \(error.localizedDescription)") } }
然后修改原有body代码,给ForEach添加onDelete修饰符,还可以新增编辑按钮方便触发编辑模式:
@ObservedObject var category : Category var body: some View { // 外层需要包裹Navigation容器,EditButton和NavigationLink才能正常工作 NavigationStack { List { ForEach(category.reminders?.allObjects as! [Reminder]) { reminder in NavigationLink(destination: ReminderDetail(reminder: reminder)) { VStack { Text(reminder.title!) } } } // 此处挂载删除方法,就是删除操作的绑定位置 .onDelete(perform: deleteReminder) } .navigationTitle("Reminders") // 导航栏新增编辑按钮,点击可进入批量删除模式 .toolbar { EditButton() } VStack { NavigationLink(destination: AddReminder(category: category)) { Text("Add Reminder") } }.padding() } }
优化建议
建议把原代码中as!强制转换替换为可选绑定,避免数据源为空时发生崩溃:
ForEach((category.reminders?.allObjects as? [Reminder] ?? [])) { reminder in
内容的提问来源于stack exchange,提问作者Filip Lederleitner
相关产品推荐
相关产品推荐

