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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:48:03