UICollectionView单元格删除

时间:2016-09-08 20:47:40

标签: ios uicollectionview

我试图从我的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

修改

我认为这不相关,但在我的自定义布局对象中,我在UICollectionViewLayoutAttributes方法中创建了prepareLayout()的缓存。缓存是一个字典,具有单独的标题,用于标题,单元格,页脚和装饰视图的属性。

2 个答案:

答案 0 :(得分:2)

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

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

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

让我知道你是怎么过的。一切都好。

答案 1 :(得分:0)

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

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

DbContext