Ios UICollectionView单元格删除

Ios UICollectionView单元格删除,ios,uicollectionview,Ios,Uicollectionview,我正在尝试从UICollectionView中删除单元格。我使用的是自定义布局,删除操作是对我添加到集合视图中的长按手势识别器的响应。根据我所读到的,我需要首先更新数据源,然后删除单元格,这就是我要做的。在self.collectionView?.deleteItemsAtIndexPaths([indexPath])之前,一切都进展顺利。我得到一个错误: ***由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“UICollectionV

我正在尝试从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
的缓存。缓存是一个字典,为标题、单元格、页脚和装饰视图的属性提供了单独的数组。

您是否尝试过使用该解决方案

在您的情况下,可能是这样的:

[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
。进行了更改-使用标准的集合视图布局时是否有功能上的差异?无。两者都是路径中第二个索引的方便访问器。这基本上是正确的。我没有很好地设计自定义布局,因此它没有在数据更改时动态地重新创建和交付属性。一旦我更新了一些方法来解释数据中的变化,它就工作得很好。非常感谢。