报错    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. Solr json,xml等文件数据导入(添加索引)linux下操作

    使用solr-5.3.1\example\exampledocs下的post.jar来完成数据导入 1.将想要导入的文件放在solr-5.3.1\example\exampledocs中,如aaa.x ...

  2. idea tomcat 怎样出现update classes and resources

    idea Tomcat 出现update classes and resources 出现热加载 正确配置应该是这个 在 Deployment (调度,部署) 中点击 + 选择war explored ...

  3. centos7安装ifconfig命令

    ifconfig命令是设置或显示网络接口的程序,可以显示出我们机器的网卡信息,可是有些时候最小化安装CentOS等Linux发行版的时候会默认不安装ifconfig等命令,这时候你进入终端,运行ifc ...

  4. 子系统设计和FishiGUI的子系统设计

    目的和问题: 除了依赖关系.还要规范操作系统适配层的全部接口.仅仅要操作系统适配层的接口在移植过程中始终保持稳定.框架层的设计和实现就不会收到影响.可是为了实现同一接口的目标,为了保证相同的功能接口能 ...

  5. jmeter测试TCP服务器/模拟发送TCP请求 设置16进制发送(转)

    转载留存:http://blog.sina.com.cn/s/blog_46d0362d0102v8ii.html 性能测试需要模拟多种场景,经常受制于资源限制,没办法建立贴近实际部署环境的场景.因而 ...

  6. hiredis中异步的实现小结

    hiredis中异步的实现小结 原文: http://blog.csdn.net/l1902090/article/details/3858... 时间: 2014-08-15 前言 一般情况下我们使 ...

  7. Jenkins插件开发资料

    原文地址:http://www.ciandcd.com/?p=181 Jenkins plugin 开发: Document http://hudson-ci.org/docs/index.html ...

  8. web页面性能分析一些网址

    https://developers.google.com/speed/pagespeed/insights/

  9. 收藏 Silverlight中子窗体关闭刷新父窗体(转载)

        public partial class MainPage : UserControl    {        public MainPage()        {            In ...

  10. LeetCode 75 Sort Colors(颜色排序)

    翻译 给定一个包括红色.白色.蓝色这三个颜色对象的数组.对它们进行排序以使同样的颜色变成相邻的,其顺序是红色.白色.蓝色. 在这里,我们将使用数字0.1和2分别来代表红色.白色和蓝色. 原文 Give ...