Ios UICollectionView单元格删除
我正在尝试从UICollectionView中删除单元格。我使用的是自定义布局,删除操作是对我添加到集合视图中的长按手势识别器的响应。根据我所读到的,我需要首先更新数据源,然后删除单元格,这就是我要做的。在Ios UICollectionView单元格删除,ios,uicollectionview,Ios,Uicollectionview,我正在尝试从UICollectionView中删除单元格。我使用的是自定义布局,删除操作是对我添加到集合视图中的长按手势识别器的响应。根据我所读到的,我需要首先更新数据源,然后删除单元格,这就是我要做的。在self.collectionView?.deleteItemsAtIndexPaths([indexPath])之前,一切都进展顺利。我得到一个错误: ***由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“UICollectionV
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
的缓存。缓存是一个字典,为标题、单元格、页脚和装饰视图的属性提供了单独的数组。您是否尝试过使用该解决方案
在您的情况下,可能是这样的:
[self.collectionView performBatchUpdates:^{
let book = self.booksForCurrentAuthor[indexPath.row]
self.booksForCurrentAuthor.removeAtIndex(indexPath.row)
self.collectionView?.deleteItemsAtIndexPaths([indexPath])
} completion:nil];
我认为您的自定义布局管理器实际上很可能是问题所在 从collectionView中删除单元格时,需要使现有布局无效,否则布局管理器只会在缓存中为您提供其最初计算的相同属性数组,包括已删除单元格的布局,因此会出现错误 从数据源中删除相关条目后,请调用cache.removeAll(),然后再次调用prepareLayout()刷新布局缓存。之后,调用collectionView.reloadData()(也许还可以调用layoutSubviews()和setNeedsDisplay),这将解决您的问题。请注意,您实际上不需要删除单元格,因为collectionView将自动从出列的单元格堆栈中加载所需的内容
让我知道你进展如何。最好。只是一个建议:在使用UICollectionView时使用
indexPath.item
。进行了更改-使用标准的集合视图布局时是否有功能上的差异?无。两者都是路径中第二个索引的方便访问器。这基本上是正确的。我没有很好地设计自定义布局,因此它没有在数据更改时动态地重新创建和交付属性。一旦我更新了一些方法来解释数据中的变化,它就工作得很好。非常感谢。