报错    Assertion failure in -[UICollectionViewData invalidateItemsAtIndexPaths:]

近来偶尔用到UICollectionView,对于九宫格之类的布局还是很方便的。但使用过程中却出现一个奇怪的问题,暂时没时间仔细研究。先记录。

在UICollectionViewCell中定义一个图标和一个文本,显示的效果是典型的九宫格。默认会有几条数据,点击最后一个cell会弹出编辑框添加自定义的cell。使用过程中出现的问题时,在第二行最后一个添加的自定义cell,图标怎么都改变不了。如果将整个view切换一下,显示又变成正常了。如下图:

查看打印出来的数据,是正常的。如下:

(
{
index = ;
name = "\U5915\U9633";
thumb = "sunset_btn_nor";
},
{
index = ;
name = "\U665a\U9910";
thumb = "dinner_btn_nor";
},
{
index = ;
name = "\U770b\U7535\U89c6";
thumb = "tv_btn_nor";
},
{
index = ;
name = "\U6e29\U548c";
thumb = "soft_btn_nor";
},
{
index = ;
name = "\U51b7\U5149";
thumb = "coldlight_btn_nor";
},
{
index = ;
name = night;
thumb = "my_btn_nor";
},
{
index = ;
name = morning;
thumb = "my_btn_nor";
},
{
index = ;
name = sunset;
thumb = "my_btn_nor";
},
{
index = ;
name = "\U81ea\U5b9a\U4e49";
thumb = "add_btn_nor";
}
)

添加断点,发现数据也没有问题。代码的处理方式是在插入或者更新数据后,调用

 

[collectionView reloadData];

的方法。

网上搜索,也看到有人问类似的问题。有些人给出的解决办法是加一个空的UIView在上面,强制整个collection view刷新。但感觉不是好的办法。

后来试了更新指定项,问题就不出现了。

以下两种方法均有效:

[self.collectionViewreloadItemsAtIndexPaths:@[[NSIndexPathindexPathForRow:7inSection:0]]];

或者

[self.collectionViewreloadSections:[NSIndexSetindexSetWithIndex:0]];

至于为什么reloadData会无效。这个暂时留下,等有空的时候再研究一下其原理。或者有牛人知道也请不吝赐教。

另外,这情况也提醒我们,能确定加载某个子项的,还是调用直接刷新指定项更好。一来效率高,二来避免出现莫名其妙的现象。

==================

昨天的问题补充一下。发现不是reloadData的问题。后来在测试中,使用reloadSections也会出现问题。
跟踪了一下,发现在reloadData过程中,最后一个(也就是新增加)的一个cell没有调用layoutSubviews。因为是在layoutSubviews中改变custom cell的image和label的值,所以新增加的cell没有刷新。后来换成了在赋值过程中调用更新image和label的代码,这样无论reloadData和reloadSections都有效了,因为这样保证了加载数据的时候imageView和label都被调用。或者也可以在cellForRowAtIndexPath中调用[cell setNeedsLayout];去强制调用layoutSubviews,这样也达到更新的效果。
但是有点比较奇怪的是,之前的uitableview和uicollectionview自定义cell都是在layoutSubviews里面更新对应的控件,却没出现过问题。是不是iOS7以后,加载的机制发生变化了。这个有待进一步研究。
今天查找资料的时候,顺便收集了一个图表,图表清楚说明了会引起调用layoutSubviews的操作。(x表示被调用)

ios UICollectionView reloadData无法更新的奇怪问题。的更多相关文章

  1. ios app 实现热更新(无需发新版本实现app添加新功能)

    目前能够实现热更新的方法,总结起来有以下三种 1. 使用FaceBook 的开源框架 reactive native,使用js写原生的iOS应用 ios app可以在运行时从服务器拉取最新的js文件到 ...

  2. 移动端H5制作安卓和IOS的坑 持续更新...

    移动端H5制作安卓和IOS的坑 持续更新... 前言:最近参加公司的H5页面创意竞赛,又遇到不少页面在不同系统上的坑.踩坑之余,觉得很多之前遇到的知识点都忘了,索性开一篇博文,把这些坑都统一归纳起来, ...

  3. iOS 10.3.3 更新背后的故事

    iOS 10.3.3 更新背后的故事 TLDR:赶紧升级! 苹果最近提示大家将系统升级到 iOS 10.3.3,并且描述这个更新的内容是:修复和改进安全性. iOS 10.3.3 includes b ...

  4. ios app 实现热更新(无需发新版本号实现app加入新功能)

    眼下可以实现热更新的方法,总结起来有下面三种 1. 使用FaceBook 的开源框架 reactive native,使用js写原生的ios应用 ios app能够在执行时从server拉取最新的js ...

  5. iOS程序自动检测更新的实现

      本文转载至 http://blog.csdn.net/davidsph/article/details/8931718 App Store自动更新itunes     之前项目需要用到app自动更 ...

  6. 【转】iOS程序自动检测更新的实现 -- 思路不错

    原文网址:http://blog.csdn.net/davidsph/article/details/8931718 之前项目需要用到app自动更新的功能,现将实现方案分享出来.iOS程序自动提示更新 ...

  7. iOS UICollectionView的实现

    ios的UICollectionView并不能在iOS6之前的版本中使用,为了兼容之前的版本需要自定义UICollectionView.写完之后发现人家已经有开源了,下过来看了看发现我是用UIScro ...

  8. iOS UICollectionView 长按移动cell

    ref:http://www.jianshu.com/p/31d07bf32d62 iOS 9之后: 示例如下 效果 前言: 看完你可以学到哪些呢? 就是文章标题那么多, 只有那么多. . 手残效果图 ...

  9. iOS UICollectionView高级用法(长按自由移动cell)-新

    [reference]http://www.jianshu.com/p/31d07bf32d62 iOS 9之后: 示例如下 效果 前言: 看完你可以学到哪些呢? 就是文章标题那么多, 只有那么多. ...

随机推荐

  1. 【AS3 Coder】任务九:游戏新手引导的制作原理(下)

    在上一篇教程中,我们了解了一套我自创的新手引导管理框架的使用原理,那么在本篇教程中,我们将考虑新手引导制作中可能遇到的一些棘手问题及探讨其解决方案.Are you ready my baby? Let ...

  2. 解决ie下载apk后更改后缀名为.zip的问题

    转自:http://www.cnblogs.com/niuniu/archive/2012/03/06/2381811.html 解决: 服务器添加MIME类型: application/vnd.an ...

  3. JSP--百度百科

    JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它[1]  是由Sun Microsystems公司倡导.许多公司参与一起建立的一种动 ...

  4. linux c中select使用技巧——计时器(转)

    通过本文你会了解到: 1. select()原型及参数说明 2. select()应用情景 3. select()注意事项 4. select()作定时器 原型 int select(int nfds ...

  5. 利用pandas进行数据分析之一:pandas数据结构Series

    Series是一种类似于一维数组的对象,又一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即是索引)组成. 可以将Series看成是一个定长的有序字段,因为它是索引值到数据值的一个映射. ...

  6. mongoDB 高级查询之取模查询$mod

    http://hancang2000.i.sohu.com/blog/view/235140698.htm $mod取模运算   查询age取模10等于0的数据 db.student.find( { ...

  7. Android自定义圆形进度条,完成类似LOFTER效果

    1.http://stackoverflow.com/questions/3760381/rotating-image-animation-list-or-animated-rotate-androi ...

  8. Hive 作业优化

    1.Join原则将条目少的表/子查询放在 Join的左边. 原因是在 Join 操作的 Reduce 阶段,位于 Join左边的表的内容会被加载进内存,将条目少的表放在左边,可以有效减少发生内存溢出的 ...

  9. webpack 环境搭建基础框架

    一.安装babel相关 1,安装依赖 cnpm i -D babel-core babel-loader babel-preset-env babel-preset-stage- babel-plug ...

  10. vue 结合localStorage 来双向绑定数据

    结合localStorage 来双向绑定数据(超级神奇) localStorage.js: const STORAGE_KEY = 'todos_vuejs' export default { fet ...