好的基本概述。我有UICollectionView
我需要支持通过performBatchUpdates:
方法添加和删除项目。如果我使用标准UICollectionViewFlowLayout
,它可以正常工作。
但是,当我尝试使用由UICollectionViewFlowLayout
提供支持的UIDynamicAnimator
时,我会在拨打performBatchChanges
后立即崩溃。
在我的自定义UICollectionViewFlowLayout
课程中,永远不会调用prepareForCollectionViewUpdates:
方法。我使用的自定义UICollectionViewFlowLayout
基于this sample。
崩溃后的控制台输出是......
*** Assertion failure in -[UICollectionViewData layoutAttributesForItemAtIndexPath:], /SourceCache/UIKit/UIKit-2903.23/UICollectionViewData.m:581
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'no UICollectionViewLayoutAttributes instance for -layoutAttributesForItemAtIndexPath: <NSIndexPath: 0xc000000000028096> {length = 2, path = 2 - 5}'
*** First throw call stack:
libc++abi.dylib: terminating with uncaught exception of type NSException
有什么想法吗?
答案 0 :(得分:13)
试
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewLayoutAttributes *layoutAttributes = [self.dynamicAnimator layoutAttributesForCellAtIndexPath:indexPath];
if(!layoutAttributes) {
layoutAttributes = [super layoutAttributesForItemAtIndexPath:indexPath];
}
return layoutAttributes;
}
当您执行performBatchUpdates
时,[self.dynamicAnimator layoutAttributesForCellAtIndexPath:
会返回nil
,如果将通过更新创建的单元格不可见。
所以只返回super
(也许是UICollectionViewFlowLayout
)'
现在是layoutAttributes
。
当即将显示的单元格时,UIDynamicAnimator
将为您完成工作。