标题是我遇到的错误,我不知道为什么,但是这里有一些信息,希望这里有人可以阐明我。
我已经分类了UICollectionViewFlowLayout
,因为这节省了我在prepareLayout
中计算单元格的帧(也许是问题?)。然后,我使用 UICollectionViewLayoutAttributes
信息来计算一种补充观点,即在放置上,我得到了我想要的布局。
我使用performBatchUpdates:completion:
添加,删除和更新视图。插入效果很好,但是删除项目是标题中显示的错误时。
所以我知道为什么发生错误,但我不知道为什么甚至应该发生。澄清一个示例,浏览导致问题的场景
- 从1个项目开始,带有1个补充查看1节
- 添加两个项目(
prepareLayout
查看3个带有3个补充视图的项目) - 删除项目(
prepareLayout
可查看2个景观,带有2个补充视图) -
layoutAttributesForSupplementaryViewOfKind:atIndexPath:
被称为要求使用>" 0和item:2
"的索引路径属性 - 崩溃,因为它要求第三个补充视图属性,即使它早些时候称为布局设置2个项目和2个补充视图
- 在辞职和绝望中伸出双手
因此,据我所知,有问题的功能是:
- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath
{
return self.layoutInfo[elementKind][indexPath];
}
当然,哪个是由UICollectionView
的内部网络自动称为自动调用
有人有任何想法吗?也许这就是我使用performBatchUpdates:completion:
的方式,但是删除效果很好,直到添加补充视图。我可以根据需要提供更多代码/说明。
我在论坛上寻找答案,并遇到了一些建议。他们都没有给我我需要的救助者,最终为了满足截止日期的利益,我完全放弃了补充观点。
几周后,出于好奇,我再次环顾四周,最终遇到了以下帖子,现在我又回到了再次使用补充视图。
所以,不要忘记返回您的:
- (NSArray<NSIndexPath *> *)indexPathsToDeleteForSupplementaryViewOfKind:(NSString *)elementKind
{
return self.removedIndexPaths;
}
到您的收集视图布局。
要防止崩溃,您可以返回所有不再有效的Indexpath的虚拟属性。这样的事情可能有助于防止您的崩溃:
UICollectionViewLayoutAttributes *layoutAttributes = self.layoutInfo[elementKind][indexPath]; // add some safety checks if this access creates an out of bounds issue
// create dummy layoutAttributes
// the workaround
if (layoutAttributes == nil) {
UICollectionViewLayoutAttributes *dummyLayoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:elementKind withIndexPath:indexPath];
dummyLayoutAttributes.frame = CGRectZero;
dummyLayoutAttributes.hidden = YES;
layoutAttributes = dummyLayoutAttributes;
}
return layoutAttributes;
这仍然会导致视图堆栈中不应该存在的对象,但它们是隐藏的,不会造成崩溃。下次UICollectionView
更新布局时,它应该清理旧的隐藏视图。