我遇到了一个奇怪的崩溃,一整天都在尝试修复它。 我有一个自定义的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}'
我的模型被正确处理了,我可以看到它正在从中删除该项!
删除项目的indexPath已经在对象之间正确传递。 唯一不会崩溃的情况是当我删除它上面的最后一个单元格时,否则就会崩溃。
这是我用来删除单元格的代码。
- (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中删除行为并在更新后再次添加
有什么见解吗?
这个问题的源代码可以在此存储库中找到。请查看。 代码存储库
最好的祝愿。 乔治。