UICollectionView reloadData的有趣问题

Oli*_*old 10 xamarin.ios ios uicollectionview

在处理UICollectionView我的应用程序时,我遇到了一个与重新加载数据有关的奇怪问题.经过大量的调试和分析日志后,我得出的结论是,如果reloadData紧接着是insertItemsAtIndexPaths下面的可怕错误,则保证会发生:

名称:NSInternalInconsistencyException原因:无效更新:第0部分中的项目数无效.更新(1)后现有部分中包含的项目数必须等于更新前该部分中包含的项目数(1),以及或减去从该部分插入或删除的项目数(插入1个)...

他们只有这种方式才能始终如一地发生在内部UICollectionView,reloadData当呼叫insertItemsAtIndexPaths到达时仍然很忙.collectionView:numberOfItemsInSectioninsertItemsAtIndexPaths完成之前连续两次调用" " 这一事实似乎支持这一事实,因为在调用其他情况下,该方法永远不会连续调用两次.

有没有人看到类似的行为或可以确认我的分析,甚至建议一个正确的解决方法?

更新:任何是的我确保所有相关的调用都发生在主线程上.

更新2:由于进入这种情况背后的推理受到质疑:我正在使用Monotouch,并且有问题的代码旨在保持通用的.Net Collections 将此事件发送到适当的调用以保持UICollectionView绑定到集合同步中.清除源集合后,它会对Reset操作作出反应,然后在项目插入其中时执行一个或多个Add操作,这会导致上述问题.希望这可以帮助.

vrw*_*wim 1

当您调用insertItemsAtIndexPaths(removeItemsAtIndexPaths类似) 时,您告诉您的 CollectionView 它的数据源现在有更多可用的项目,并且它应该在您指定的索引路径中插入这些可用的项目。

它检查您的数据源该语句是否正确,如果它检测到旧项目的数量加上您所说插入的项目的数量不等于新项目的数量,它会说它无法进行更新,因为您对更改了多少项目撒了谎。

现在,您正在做的是告诉您的 CollectionView 它应该从其数据源重新加载所有数据(使用新数据),然后您告诉它您插入了 x 个项目。这是一个错误的陈述,因为您刚刚重新加载了 CollectionView,它更新了其项目数量,因此更新前的项目数量等于更新后的项目数量(您没有执行任何操作),而不是增加您指定的索引路径数量。

我希望你仍然和我在一起,因为这是你的解决方案:

删除reloadData之前的insertItemsAtIndexPaths,因为这会破坏其断言,并且在错误使用时会引发异常。如果您想在插入项目之前重新加载集合视图,请确保insertItemsAtIndexPaths在更改数据源中的项目后立即执行。

请在此处阅读此方法的文档。