我被一个奇怪的崩溃困住了,整天都在试图修复它。我有一个自定义 UICollectionViewLayout,它基本上为单元格添加了重力和碰撞行为。
实施效果很好!当我尝试使用 [self.collectionView performBatchUpdates:] 删除一个单元格时,就会出现问题。
它给了我以下错误:
2013-12-12 21:15:35.269 APPNAME[97890:70b] *** Assertion failure in -[UICollectionViewData validateLayoutInRect:], /SourceCache/UIKit_Sim/UIKit-2935.58/UICollectionViewData.m:357
2013-12-12 20:55:49.739 APPNAME[97438:70b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionView recieved layout attributes for a cell with an index path that does not exist: <NSIndexPath: 0x975d290> {length = 2, path = 0 - 4}'
我的模型得到了正确处理,我可以看到它从中删除了项目!
要删除的项目的 indexPaths 在对象之间正确传递。唯一一次 collectionView 更新不会崩溃是当我删除它上面的最后一个单元格时,否则会发生崩溃。
这是我用来删除单元格的代码。
- (void)removeItemAtIndexPath:(NSIndexPath *)itemToRemove completion:(void (^)(void))completion
{
UICollectionViewLayoutAttributes *attributes = [self.dynamicAnimator layoutAttributesForCellAtIndexPath:itemToRemove];
[self.gravityBehaviour removeItem:attributes];
[self.itemBehaviour removeItem:attributes];
[self.collisionBehaviour removeItem:attributes];
[self.collectionView performBatchUpdates:^{
[self.fetchedBeacons removeObjectAtIndex:itemToRemove.row];
[self.collectionView deleteItemsAtIndexPaths:@[itemToRemove]];
} completion:nil];
}
处理单元格属性的 CollectionView 委托是下面的基本委托。
- (CGSize)collectionViewContentSize
{
return self.collectionView.bounds.size;
}
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
return [self.dynamicAnimator itemsInRect:rect];
}
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
return [self.dynamicAnimator layoutAttributesForCellAtIndexPath:indexPath];
}
我已经尝试过但没有成功的事情: - 使布局无效 - 重新加载数据 - 从 UIDynamicAnimator 中删除行为并在更新后再次添加它们
有什么见解吗?
此存储库中提供了有问题的源代码。请检查一下。代码库
最好的。乔治。