Ios UICollectionView在重新加载Sections之后:和重新加载数据单元格未正确更新

Ios UICollectionView在重新加载Sections之后:和重新加载数据单元格未正确更新,ios,uicollectionview,reloaddata,Ios,Uicollectionview,Reloaddata,我有一个带有UICollectionView的控制器实现,它有两个部分。 节数据是从两个不同的API获取的,返回顺序未知 当返回第一节数据时,我调用reloadSections来更新第一节的单元格。 当返回第二部分数据时,我调用reloadData来更新整个单元格(包括第一部分和第二部分) 但是,如果我在重新加载节之前调用重新加载数据,单元格将正确更新。 在reloadData之前调用reloadSections时,第二部分中的项目计数是正确的,但单元格显示重复内容,而不是新内容 我写了一个演示

我有一个带有UICollectionView的控制器实现,它有两个部分。 节数据是从两个不同的API获取的,返回顺序未知

当返回第一节数据时,我调用reloadSections来更新第一节的单元格。 当返回第二部分数据时,我调用reloadData来更新整个单元格(包括第一部分和第二部分)

但是,如果我在重新加载节之前调用重新加载数据,单元格将正确更新。 在reloadData之前调用reloadSections时,第二部分中的项目计数是正确的,但单元格显示重复内容,而不是新内容

我写了一个演示项目,在第二节中插入新数据,调用reloadData,在第一节中插入新数据。集合视图也可以正常工作

当我调用ReloadSection:FirstSection,然后调用reloadData时,它就不起作用了

演示项目可在此处找到:

p、 当我为每个部分更新调用reloadSections时,结果是正确的

p、 当我为第一部分调用reloadSections时,它会重新加载第一部分中的所有单元格。但之后,我调用reloadData,它只调用第二节中最后一项的cellForItem,我将新项添加到第二节的前面。所以它显示了上一个项目的重复内容上一个是最后一个

但单元格显示的是重复内容,而不是新内容


最常见的原因是,若重用单元格,则必须清除单元格内容。例如:您应该删除以编程方式创建的视图或清除字段或标签值…

问题在于,当重新加载数据被称为仅集合视图调用时

cellForItemAtIndexPath

用于第二个列表和第二个列表中的最后一个索引。所以你的数据是重复的。它应该重新加载整个集合视图,但不会这样做。我认为是出于某种性能原因,或者是其他原因。在重新加载文档中,他们还说

“不要在动画中称之为插入或删除”


您正在该过程中调用它,因此从集合视图来看,这是一种性能效率。在集合视图完全重新加载后,尝试在其他情况下调用这些插入。我运行了你的项目,从断点检查中我发现了这个结论。祝你好运

我发现,如果我为每个部分更新调用reloadSections,它将正常工作。只调用reloadSections然后再调用reloadData它不会正确地更新第二节(它说我将在后面插入新数据,并且只在后面创建和更新新数据,我可能会在前面插入新数据)。是的,reloadSections工作正常。是,如果在数组末尾添加数据,它将正常工作。因为集合视图只调用它通过提供结束索引路径而获得的数据增量。