- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
在我的应用程序中处理 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/
文档:https://www.xfyun.cn/doc/spark/PPTGeneration.html 价格方面提供了免费1000点的额度,生成一次是10点,正好10
我有一个工具按钮和一个分配给它的操作。但该操作没有点击事件,也没有点击代码。因此该按钮被禁用,如何将其更改为启用? 谢谢! 最佳答案 当某个操作没有 OnExecute 处理程序时,该操作始终处于禁用
我有一个 C 程序,它初始化两个结构并尝试打印它们的值。请参阅下面的代码。 #include #include typedef struct node{ int data; struc
我在回答 this question当我想到这个例子时: #include void func(int i); void func(); int main (){ func(); r
这些bug可能够你喝一壶的。 1、被断言(assert)包含的代码 常发生在切换到release版本时,执行结果乖乖的,最终查找结果是assert括号里的代码在release下是不执行的。
我正在谈论一个独立的对象,稍后我想使用 saveOrUpdate() 进行更新。 我们如何同时设置 null 和clear()引用的集合? A[1:1]B[1:M]C B 到 C 的引用可以为空,这意
我最近完成了 Marjin Haverbeke 的书“Eloquent Javascript, Second Edition”中的一项挑战。 One had to create此控制台输出使用 for
我写了一个 HtmlHelper 表达式,我花了很多时间将标题标签放入我的下拉列表中,如下所示: public static HtmlString SelectFor( thi
你知道有哪些开放的软件项目有特别有趣/写得很好的单元测试吗? 编写单元测试对我来说通常感觉很奇怪,因为它似乎太随机、太密集、太稀疏,……阅读一些现实世界的例子(而不是书籍、图书馆示例代码等)会很棒。
我有一个我目前正在使用的 Silverlight 应用程序,它为其 MVVM 框架实现了 Caliburn.Micro。一切正常,但我注意到一些绑定(bind)中的一些有趣之处。我拥有的是处理应用程序
我通过 swscale 运行 png 图像数据以获取 YUV420P 数据,然后使用 MSMPEG4V1 编解码器对该帧进行编码,从而在 iPhone 上对一些视频进行编码。在 api 文档中,avc
我写了一个页面,发现 addEventListener("loadedmetadata",fun) 在 firefox 上运行不正确 我正在尝试修复一个旧软件的错误。在加载视频和页面时,该软件尝试在页
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一名优秀的程序员,十分优秀!