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
相关产品推荐
相关产品推荐

