UICollectionView 单元格删除

Posted

技术标签:

【中文标题】UICollectionView 单元格删除【英文标题】:UICollectionView Cell Deletion 【发布时间】:2016-09-08 20:47:40 【问题描述】:

我正在尝试从我的 UICollectionView 中删除一个单元格。我正在使用自定义布局,并且删除是响应我添加到集合视图中的长按手势识别器而发生的。根据我的阅读,我需要先更新数据源,然后删除单元格,这就是我所做的。一切顺利,直到self.collectionView?.deleteItemsAtIndexPaths([indexPath])。我得到错误:

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“UICollectionView 收到的单元格的布局属性具有不存在的索引路径:length = 2, path = 0 - 0”

我已阅读其他类似的 SO 问题,但似乎无法正常工作。

let book = self.booksForCurrentAuthor[indexPath.row]

self.booksForCurrentAuthor.removeAtIndex(indexPath.row)
self.collectionView?.deleteItemsAtIndexPaths([indexPath])

//Delete book from database

编辑

我认为这无关紧要,但在我的自定义布局对象中,我从 prepareLayout() 方法中创建了 UICollectionViewLayoutAttributes 的缓存。缓存是一个字典,为 Headers、Cells、Footer 和 Decoration 视图的属性提供单独的数组。

【问题讨论】:

只是一个建议:在使用 UICollectionView 时使用 indexPath.item 做出改变 - 使用有点标准的集合视图布局时是否存在功能差异? 无。两者都是路径中第二个索引的便捷访问器。 【参考方案1】:

我认为您的自定义布局管理器实际上很可能是问题所在。

当您从 collectionView 中删除单元格时,您需要使现有布局无效,否则布局管理器只会在缓存中为您提供最初计算的相同属性数组 - 包括您已删除的单元格的布局,因此错误。

从数据源中删除相关条目后,调用 cache.removeAll(),然后再次调用 prepareLayout() 以刷新布局缓存。之后,调用 collectionView.reloadData() (也许还有 layoutSubviews() 和 setNeedsDisplay),这应该可以解决您的问题。请注意,您实际上不需要删除单元格,因为 collectionView 会自动从出列的单元格堆栈中加载所需的内容。

让我知道你过得怎么样。一切顺利。

【讨论】:

这基本上是正确的。我没有很好地设计自定义布局,因此它没有随着数据的变化而动态地重新创建和传递属性。一旦我更新了一些方法来解释数据的变化,它就可以正常工作了。谢谢。【参考方案2】:

您是否尝试过 Delete cell from UICollectionView 的解决方案?

在你的情况下,它会是这样的:

[self.collectionView performBatchUpdates:^
        let book = self.booksForCurrentAuthor[indexPath.row]
        self.booksForCurrentAuthor.removeAtIndex(indexPath.row) 
        self.collectionView?.deleteItemsAtIndexPaths([indexPath])
     completion:nil];

【讨论】:

以上是关于UICollectionView 单元格删除的主要内容,如果未能解决你的问题,请参考以下文章

在 UICollectionView/UITableView 中为滚动视图的偏移设置动画会导致单元格过早消失

UICollectionView,按钮未出现

UICollectionView中删除一个单元格后刷新单元格布局

UICollectionView:删除单元格问题

UICollectionView 单元格删除

单元格删除时的 UICollectionView 动画