gpt4 book ai didi

ios - UICollectionView reloadData 的有趣问题

转载 作者:技术小花猫 更新时间:2023-10-29 11:08:11 25 4
gpt4 key购买 nike

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

Name: NSInternalInconsistencyException Reason: Invalid update: invalid number of items in section 0. The number of items contained in an existing section after the update (1) must be equal to the number of items contained in that section before the update (1), plus or minus the number of items inserted or deleted from that section (1 inserted) ...

让这种情况持续发生的唯一方法是,当调用 insertItemsAtIndexPaths 时,内部 UICollectionView 仍然忙于 reloadData。在 insertItemsAtIndexPaths 完成之前连续调用两次“collectionView:numberOfItemsInSection”这一事实似乎支持这一点,因为在调用其他情况下该方法从未连续调用两次.

有没有人看到过类似的行为或者可以证实我的分析甚至建议适当的解决方法?

更新:是的,我已经确保所有相关调用都发生在主线程上。

更新 2:由于进入这种情况背后的原因受到质疑:我正在使用 Monotouch 并且有问题的代码旨在保持通用 .Net 集合触发 this event进入适当的调用以保持绑定(bind)到集合的 UICollectionView 同步。清除源集合后,它会响应 Reset 操作,然后在项目插入其中时执行一个或多个 Add 操作,这会导致上述问题。希望这会有所帮助。

最佳答案

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

它会检查您的数据源该声明是否为真,如果它检测到旧项目的数量加上您所说的插入的项目数量不等于新项目的数量,它会说它无法执行更新,因为您谎报了更改的项目数量。

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

我希望你仍然支持我,因为这是你的解决方案:

删除 insertItemsAtIndexPaths 之前的 reloadData,因为这会破坏其断言,并且在使用不当时会抛出异常。如果您想在插入项目之前重新加载 Collection View ,请确保在更改数据源中的项目后立即执行 insertItemsAtIndexPaths

阅读此方法的文档 here .

关于ios - UICollectionView reloadData 的有趣问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18715395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com