SwiftUI 如何通过ID删除列表Identifiable元素并保留原生删除动画
实现方案
完全可以使用SwiftUI原生API实现,保留默认滑动删除动画的核心逻辑是:先对ForEach绑定的数据源数组执行删除操作触发系统动画,再调用你的ID维度删除接口操作数据库,不需要额外引入第三方组件。
第一步:确保ViewModel的数据源是响应式的
你的FavViewModel需要把存储列表数据的items属性声明为@Published,这样数组变动时会自动通知视图刷新:
class FavViewModel: ObservableObject { // 必须加上@Published装饰,数组变更会自动触发视图更新 @Published var items: [ItemPreviewModel] = [] // 你的其他原有逻辑,比如fetchData()等等 }
第二步:修改onDelete的实现
直接在onDelete的回调里倒序遍历下标集合(避免批量删除时下标偏移出错),先删除本地数组元素触发原生动画,再调用数据库删除方法即可:
.onDelete(perform: { indexSet in // 倒序遍历支持批量删除,避免下标错乱 indexSet.reversed().forEach { index in guard let targetId = favList.items[index].id else { return } // 1. 先更新本地数组,触发List自带的删除动画 favList.items.remove(at: index) // 2. 调用你现有的数据库删除方法 onDelete(id: targetId) } })
注意事项
- 你的
ItemPreviewModel的id是可选类型,建议在数据请求/入库阶段做非空校验,避免出现id为空无法执行删除的问题 - 如果数据库删除方法是异步操作,不需要等待回调再更新本地数组,先更新数据源触发动画即可;如果数据库删除失败,只需把元素插回原数组对应位置,也会自动触发插入动画做回滚
onDelete触发的操作默认已经携带系统原生动画,绝大多数场景不需要额外包裹withAnimation块
内容的提问来源于stack exchange,提问作者Farhandika
相关产品推荐
相关产品推荐

