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

Swift 4中Collection View Cell删除异常:点击任意单元格均删最后一项

解决Firestore删除文档时总是删除最后一条的问题

我来帮你搞定这个问题!你遇到的核心问题是:你用的documentID变量应该是全局或者在数据加载时被不断覆盖了,导致它始终存储的是最后一条加载的文档ID,所以不管点击哪个单元格,都会删除最后那条数据。下面是具体的修复方案:

步骤1:给数据模型添加文档ID字段

首先,确保你的数据模型里包含Firestore文档的ID,这样每条数据都能和自己的文档ID绑定:

struct News {
    let documentID: String
    let title: String // 这里换成你实际的字段
    // 其他需要的字段都可以加在这里
}

步骤2:加载数据时保存文档ID到本地数组

在从Firestore拉取数据的时候,把每个文档的ID一起解析出来,存到本地的数据源数组里:

var newsData: [News] = []

func fetchNewsFromFirestore() {
    let db = Firestore.firestore()
    db.collection("news").getDocuments { snapshot, error in
        guard let docs = snapshot?.documents else {
            print("获取数据失败:\(error!)")
            return
        }
        
        self.newsData = docs.map { doc in
            News(
                documentID: doc.documentID,
                title: doc["title"] as? String ?? "" // 对应你Firestore里的字段
                // 解析其他字段
            )
        }
        self.collectionView.reloadData()
    }
}

步骤3:修改删除方法,通过Cell获取对应文档ID

现在修改你的删除方法,先通过Cell拿到它在CollectionView里的索引,再从本地数组里取出对应的文档ID,这样就能精准删除对应的Firestore文档了:

func deleteCell(cell: CollectionViewCell) {
    // 先拿到当前cell的索引路径
    guard let indexPath = collectionView.indexPath(for: cell) else { return }
    // 从数据源数组里拿到对应的新闻条目
    let targetNews = newsData[indexPath.item]
    let db = Firestore.firestore()
    
    db.collection("news").document(targetNews.documentID).delete { err in
        if let err = err {
            print("删除文档出错:\(err)")
        } else {
            // 删除成功后,记得更新本地数组和CollectionView
            self.newsData.remove(at: indexPath.item)
            self.collectionView.deleteItems(at: [indexPath])
        }
    }
}

为什么之前的代码不行?

你之前的代码里,documentID应该是一个被反复赋值的变量,每次加载数据时它都会被最后一条文档的ID覆盖。当你点击任意Cell时,程序只会用这个已经被覆盖成最后一条的ID去删除,自然就总是删最后一条啦。现在通过把每个文档的ID和对应的数据绑定,再通过Cell的索引找到正确的ID,就能解决这个问题啦。

内容的提问来源于stack exchange,提问作者Shahid Miah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:15:08