iOS tableview 刷新一般不会注意的小问题

时间:2024-03-15 20:35:47

前言:

在最近的工作中发现了一个关于tableView刷新出现的问题,以前从来没有考虑过的问题, 通常我们刷新tableview数据的时候调用-reloadData 或者 - reloadRowsAtIndexPaths:withRowAnimation: 或者 -reloadSections:withRowAnimation:,考虑到性能问题(其实一般的项目并不会过多的影响性能).我在数据请求结束之后用第三个方法刷新了tableView的数据,而通过crash 日志看到竟然有崩溃.当然是非常非常少的人出现了这种情况.描述一下发生的场景
iOS tableview 刷新一般不会注意的小问题
过程是:1. btn1 和btn2 的数据(类型)个数不同.且数据需用请求获得,然后要刷新界面
  2.第一次获取数据之后 数据被缓存到本地
  3.第二次启动应用从本地拿到数据并且填充 btn1 下有4个数据对应的绿色,btn btn2 下是两个
  4.在数据未返回的情况下,用户快速点击了btn2 界面切换到下边的图.然后此时数据返回了,页面中cell刷新
  5.刷新默认btn1是选中状态然后变成了上边的图但是controller里index = 2 dataCount = 2 
  6.点击图一中后两个绿色btn 数据类型不对出问题


我个人用的方法(由于分了组)是-reloadSections:withRowAnimation: 发现-awakeFromNib 或者 -initWithStyler: reuseIdentifier:的方法只要reload 一次就调用重建一次,cell的地址每次都是新的,然后换成-reloadData病没有这种问题.从网上找了很多博客和资料发现并没有特别好的解释,最后去苹果看了Document发现了一些问题.

reloadSections:withRowAnimation在Document中有一句话是这么解释的:


Calling this method causes the table view to ask its data source for new cells for the specified sections.The table view animates the insertion of new cells in as it animated the old cells out


很明显,这个方法是cell的数据源变化创建特定的sections的新的cell 去代替旧的cell,即肯定是创建新的cell了,也就不难理解为什么会调用初始化方法,cell的地址为何不同了,那怎么解决?

If,however,you just want to change values in cells of the specified sections without alerting the user,you can get hose cells and directly set their new values.

 
如果你仅仅是想改变cell中的值.而不通知user 那么你可以获得这些cell然后去重新赋值.
然后我查询了- reloadRowsAtIndexPaths:withRowAnimation: 基本上意思都是一样的,如果需要对特定的一些row进行数据的更新不需要调用这个方法,找到要变更的信息从新refresh数据即可
怎么获取cell 知道要刷新的row 调用cellForRowAtIndexPath: 获得cell 再刷新即可