-layoutAttributesForSupplementaryElementOfKind没有UICollectionViewLayoutAttributes实例:

时间:2016-06-24 04:31:48

标签: ios objective-c uicollectionview uicollectionviewlayout uicollectionreusableview

标题是我得到的错误,我不知道为什么,但这里有一些信息,所以希望有人在这里可以阐明我。

我已经将[{1}}子类化了,因为这可以节省我UICollectionViewFlowLayout计算单元格的帧(也许这是一个问题?)。然后我使用prepareLayout信息来计算一个补充视图,我得到了我想要的布局。

我使用UICollectionViewLayoutAttributes添加,删除和更新视图。插入工作正常,但删除项目是出现标题中显示的错误。

所以我知道错误发生的原因但我不知道为什么它应该发生。通过一个导致问题的场景的例子来澄清

  1. 从1个项目开始,包含1个补充视图1个部分
  2. 再添加两个项目(performBatchUpdates:completion:看到3个项目,包含3个补充视图)
  3. 删除项目(prepareLayout看到2个视图,包含2个补充视图)
  4. prepareLayout被称为要求索引路径的属性 section:0和item:2
  5. 崩溃,因为它要求第三个补充视图的属性,即使它之前称为准备布局设置2个项目和2个补充视图
  6. 举手辞职和绝望
  7. 因此,据我所知,违规行为是:

    layoutAttributesForSupplementaryViewOfKind:atIndexPath:

    当然由- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath { return self.layoutInfo[elementKind][indexPath]; } 的内部网络自动调用,所以我不知道为什么它要求在索引路径上的补充视图。

    有人有任何想法吗?也许这就是我使用UICollectionView的方式,但删除工作正常,直到添加补充视图。我可以根据需要提供更多的代码/解释。

2 个答案:

答案 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更新它的布局时,它应该清除旧的隐藏视图。