标题是我得到的错误,我不知道为什么,但这里有一些信息,所以希望有人在这里可以阐明我。
我已经将[{1}}子类化了,因为这可以节省我UICollectionViewFlowLayout
计算单元格的帧(也许这是一个问题?)。然后我使用prepareLayout
信息来计算一个补充视图,我得到了我想要的布局。
我使用UICollectionViewLayoutAttributes
添加,删除和更新视图。插入工作正常,但删除项目是出现标题中显示的错误。
所以我知道错误发生的原因但我不知道为什么它应该发生。通过一个导致问题的场景的例子来澄清
performBatchUpdates:completion:
看到3个项目,包含3个补充视图)prepareLayout
看到2个视图,包含2个补充视图)prepareLayout
被称为要求索引路径的属性 section:0和item:2 因此,据我所知,违规行为是:
layoutAttributesForSupplementaryViewOfKind:atIndexPath:
当然由- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath
{
return self.layoutInfo[elementKind][indexPath];
}
的内部网络自动调用,所以我不知道为什么它要求在索引路径上的补充视图。
有人有任何想法吗?也许这就是我使用UICollectionView
的方式,但删除工作正常,直到添加补充视图。我可以根据需要提供更多的代码/解释。
答案 0 :(得分:3)
我搜索论坛寻找答案,并提出了一些建议。他们都没有给我我需要的救助,最终为了满足最后期限,我完全放弃了补充意见的使用。
几个星期后,出于好奇,我再次环顾四周,最终came across the following post,现在我又回到了补充观点。
所以,别忘了回复你的:
- (NSArray<NSIndexPath *> *)indexPathsToDeleteForSupplementaryViewOfKind:(NSString *)elementKind
{
return self.removedIndexPaths;
}
到您的收藏夹视图布局。
答案 1 :(得分:2)
为了防止崩溃,您可以为所有那些无效的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
更新它的布局时,它应该清除旧的隐藏视图。