2

标题是我遇到的错误,我不知道为什么,但这里有一些信息,希望这里的人可以解释我。

我已经分类UICollectionViewFlowLayout,因为这样可以节省我自己计算单元格的框架(也许这是一个问题?)prepareLayout。然后我使用这些UICollectionViewLayoutAttributes信息来计算覆盖它的补充视图,我得到了我想要的布局。

performBatchUpdates:completion:用来添加、删除和更新视图。插入工作正常,但删除项目时出现标题中显示的错误。

所以我知道为什么会发生错误,但我什至不知道为什么会发生错误。举例说明导致问题的场景

  1. 从 1 个项目和 1 个补充视图 1 个部分开始
  2. 再添加两个项目(prepareLayout见 3 个项目和 3 个补充视图)
  3. 删除项目(prepareLayout查看 2 个视图和 2 个补充视图)
  4. layoutAttributesForSupplementaryViewOfKind:atIndexPath:被称为询问具有section:0 和 item:2的索引路径的属性
  5. 崩溃是因为它要求第三个补充视图的属性,即使之前它调用了准备布局设置 2 个项目和 2 个补充视图
  6. 在辞职和绝望中举手

所以据我所知,有问题的功能是:

- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath
{
    return self.layoutInfo[elementKind][indexPath];
}

这当然是由内部网络自动调用的,UICollectionView所以我不知道它为什么在该索引路径上要求该补充视图。

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

4

2 回答 2

4

我搜索了论坛寻找答案并提出了一些建议。他们都没有给我我需要的帮助,最终为了赶上最后期限,我完全放弃了使用补充观点。

几周后,出于好奇,我再次环顾四周,最终看到了以下帖子,现在我又开始使用补充视图了。

所以,不要忘记返回您的:

- (NSArray<NSIndexPath *> *)indexPathsToDeleteForSupplementaryViewOfKind:(NSString *)elementKind
{
    return self.removedIndexPaths;
}

到您的收藏视图布局。

于 2016-07-10T07:57:07.190 回答
2

为了防止崩溃,您可以为所有不再有效的 indexPaths 返回虚拟属性。这样的事情可以帮助防止你的崩溃:

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

于 2016-07-10T07:53:18.810 回答