【发布时间】:2013-12-13 13:41:06
【问题描述】:
我遇到了一个奇怪的崩溃,整天都在尝试修复它。 我有一个自定义 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 中移除行为并在更新后再次添加它们
有什么见解吗?
此存储库中提供了存在问题的源代码。请检查一下。 Code Repository
最好的。 乔治。
【问题讨论】:
-
尝试在返回单元格的数据委托方法中添加一些代码并在控制台上监控请求。同样,将日志记录添加到返回部分数、单元数的方法中。也许 cv 甚至在开始批量更新之前就请求后者(在这种情况下,您需要将您的信标删除移出块之前。真的,我很同情 - 批量更新对我来说工作得很好,我做了一个小更改我的单元格(添加视图),然后wham,它开始崩溃,我不得不使每一个更改都使用重新加载:-(
-
谢谢大卫。这是加载、删除和崩溃序列的输出。看来计数还可以。 Link to output log
-
能否在performBatchUpdates之前和之后,以及在每个代码行之前,中间和之后的块内添加日志。也为了让我高兴在删除后添加日志 self.fetchedBeacons 中的项目数(使中间日志消息),然后更新日志。我知道这是一个 PITA,但我对 CV 所做的是编写一个非常简单的单视图应用程序,它在单元格中使用标签,以使用各种做事模式。如果这有效并且复杂的代码不会搞砸它的简历(很可能)。 CV 似乎改变了细胞复杂程度的行为,这真的让我们很难!
-
我在“-[UICollectionViewData validateLayoutInRect:] 中的断言失败”上进行了搜索,并获得了大量点击。一种可能的解决方案:stackoverflow.com/a/19378624/1633251 - 另一个很好的解决方案 stackoverflow.com/a/18411860/1633251 。嗯,您是否正在验证该项目是否可见?如果不是,也许只是重新加载数据就可以了……
-
@DavidH 谢谢大卫。我已经尝试过建议的链接。重新加载数据并使布局无效似乎没用。似乎 dynamicAnimator 完全控制了它。此外,我使用的是自定义布局,因此这里永远不会调用标题大小。我在一个工作示例中隔离了代码。如果您有时间并想深入研究此错误,请检查一下。 Code Repository最好!!!
标签: ios objective-c uicollectionview uicollectionviewlayout uikit-dynamics