[英]Interesting issue with UICollectionView reloadData
在我的应用程序中处理UICollectionView
,我遇到了一个与重新加载数据有关的奇怪问题。 经过大量的调试和分析日志后,我得出的结论是,如果reloadData
后面紧跟insertItemsAtIndexPaths
,则保证发生下面的可怕错误:
名称:
NSInternalInconsistencyException
原因:无效更新:第0节中的项目数无效。更新后现有部分中包含的项目数(1)必须等于更新前该部分中包含的项目数(1),加上或减去从该部分插入或删除的项目数(插入1个)...
它们只能始终如一地发生这种情况,即当对insertItemsAtIndexPaths
的调用到达时, UICollectionView
内部仍然忙于reloadData
。 在insertItemsAtIndexPaths
完成之前连续两次调用“ collectionView:numberOfItemsInSection
”这一事实似乎支持这一点,因为在调用其他情况下,该方法永远不会连续调用两次。
有没有人看到类似的行为或可以确认我的分析,甚至建议一个正确的解决方法?
更新 :任何是的我确保所有相关的调用都发生在主线程上。
更新2 :由于完全陷入这种情况背后的推理受到质疑:我正在使用Monotouch,并且有问题的代码旨在保持通用的.Net Collections 将此事件发送到适当的调用以保持UICollectionView绑定到集合同步中。 清除源集合后,它会对Reset操作作出反应,然后在项目插入其中时执行一个或多个Add操作,这会导致上述问题。 希望这可以帮助。
当您调用insertItemsAtIndexPaths
( removeItemsAtIndexPaths
类似)时,您告诉您的collectionview其数据源现在有更多可用项,并且它应该在您指定的索引路径中插入这些可用项。
它检查您的数据源是否该语句是真的,如果它检测到旧项目的数量加上您说的插入的项目数量不等于新项目的数量,它表示它无法进行更新,如你撒谎了你改变了多少项。
现在,你正在做的是你告诉你的collectionview它应该从它的数据源(使用新数据)重新加载它的所有数据,然后就告诉它你插入了x项。 这是一个虚假陈述,因为你刚刚重新加载了集合视图,它更新了它的项目数量,因此更新前的项目数量等于更新后的项目数量(你没有做任何事情),而不是增加了您指定的索引路径数量。
我希望你还和我在一起,因为这是你的解决方案:
在insertItemsAtIndexPaths
之前删除reloadData
,因为这会破坏其断言并在错误使用时抛出异常。 如果要在插入项目之前重新加载集合insertItemsAtIndexPaths
,请确保在更改数据源中的项目后立即执行insertItemsAtIndexPaths
。
阅读了此方法的文档上这里 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.