没有uicollectionViewLayoutAttributes实例-layoutattributesforsupp



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

我已经分类了UICollectionViewFlowLayout,因为这节省了我在prepareLayout中计算单元格的帧(也许是问题?)。然后,我使用 UICollectionViewLayoutAttributes信息来计算一种补充观点,即在放置上,我得到了我想要的布局。

我使用performBatchUpdates:completion:添加,删除和更新视图。插入效果很好,但是删除项目是标题中显示的错误时。

所以我知道为什么发生错误,但我不知道为什么甚至应该发生。澄清一个示例,浏览导致问题的场景

  1. 从1个项目开始,带有1个补充查看1节
  2. 添加两个项目(prepareLayout查看3个带有3个补充视图的项目)
  3. 删除项目(prepareLayout可查看2个景观,带有2个补充视图)
  4. layoutAttributesForSupplementaryViewOfKind:atIndexPath:被称为要求使用>" 0和item:2
  5. "的索引路径属性
  6. 崩溃,因为它要求第三个补充视图属性,即使它早些时候称为布局设置2个项目和2个补充视图
  7. 在辞职和绝望中伸出双手

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

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

相关内容

  • 没有找到相关文章

最新更新