UITableView是ios开发中使用率极高的一个控件,就我个人来说,几乎我做的每一个View上都有她的身影。但是很长一段时间,我对她的理解都很肤浅。对我来说触动较大的两个东西,一个是前面提到的自定义UITableViewCell,再有就是今天要提的这个复用了。
所谓复用表面意思来理解就是重复利用了。大致的工作原理就是:UITableView属于lazy loading,也就是只加载会在界面上显示的部分。举个例子,比如说UITabeview的高度是460,咱们每个Cell的高度是230,这样的话, 手机界面上最多就显示两个Cell,当你向上划动,第一个Cell一些离开界面,第三个Cell的一些出现在界面的时候会再创建第三个Cell。注意关键 部分到了,再第二个Cell开始离开界面,第四个Cell出现的时候,这时候不会创建第四个Cell,而是直接复用的第一个Cell!也就是说无论你的 UITableView里有十条或者三十条数据,只会创建三个Cell来展示这些数据!

总的来说,这种工作机制很合理,无论从CPU和内存的角度考虑都很节省资源,但是这里有一个问题就是:这种机制是用来展示结构一样的数据的!很多时候我们 总要实现动态加载,总要有一个Cell,与其它的Cell不同,用来显示“正在加载中”或者“加载更多”之类的东西。这时候在Cell复用的机制下会出现 重叠的现像!
ok,光说不练,没啥用,简单演示一下:
  _objects = [[NSMutableArray alloc] init];
  for (int i = 0; i < 10; i++) {
    [_objects addObject:[NSString stringWithFormat:@"text %d",i]];
  }
  [_objects addObject:@"加载更多"];
  for (int i = 0; i < 10; i++) {
    [_objects addObject:[NSString stringWithFormat:@"text %d",i]];
  }
我们在一个数组里加了21条数据,而且中间那条不一样,属于我们说的数据结构不一致的那种。
cell展示部分我们是这么写的:
  NSString *_text = [_objects objectAtIndex:indexPath.row];
 
  //我们希望“加载更多”这行是居中显示
  if (![_text hasPrefix:@"text"]) {
    cell.textLabel.textAlignment = UITextAlignmentCenter;
  }

cell.textLabel.text = _text;
ok,我们运行一下:




向下拖动一下,目前看来是没有问题的。可是当我们上下拖动了几次以后,问题出现了。。




由于cell的复用机制,“文本居中”(UITextAlignmentCenter)这种属性渐渐的被其它Cell用上了。这个肿么办呢?最早的时候,我通过了网上搜索,大家都说这是Cell的复用的问题。而我想当然的认为,既然是复用,那我就不复用就好了。于是我把
  if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
  }
改成了:
  if (cell != nil) {
    [cell release];
  }
  cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
  cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
是的,在我这么改完以后,UITableView看起来确实是按我想的方式工作了,事实上很长的时间里都没再出过错。(不要问我为什么不在if后面 跟个else把文本的属性设成“文本居左”(UITextAlignmentLeft),因为实际的数据比这复杂的多。)这种方法一直工作的很ok(确切 的说是在iphone4上),直到很久以后,我把同样的程序在itouch上一跑,没载入多少条数据就提示Received memory warning了。。。。。
所以我知道了正确的Cell复用的方式:
  NSString *_text = [_objects objectAtIndex:indexPath.row];
 
  UITableViewCell *cell;
  if ([_text hasPrefix:@"text"]) {
    static NSString *CellIdentifier = @"Cell";
   
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                     reuseIdentifier:CellIdentifier] autorelease];
      cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
  }
  else {
    static NSString *CellIdentifier = @"CellReuse";
   
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                     reuseIdentifier:CellIdentifier] autorelease];
      cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
   
    cell.textLabel.textAlignment = NSTextAlignmentCenter;
  }
 
  cell.textLabel.text = _text;
再运行试一下,是不是怎么上下拖动也不报错了:)

关于UITableView的Cell复用谈谈我的一些心得滴水穿石相关推荐

  1. 关于UITableView的Cell zhuanzai

    关于UITableView的Cell复用谈谈我的一些心得 2012-06-13 12:16:15|  分类: Apple|字号 订阅 UITableView是ios开发中使用率极高的一个控件,就我个人 ...

  2. iOS8+ UITableView自动计算cell高度并缓存

    这篇文章我们来讲一下UITableView的cell自适应高度,以及遇到的问题的解决办法.在看文章之前希望你已经会UITableView的基本使用了. 先奉上这篇文章的demo的Github地址:UI ...

  3. IOS开发(27)之UITableView的Cell显示长按快捷菜单

    1 前言 对于UITableView的Cell长按,可以触发快捷菜单,包括复制,粘贴之类的操作. 2 代码实例 ZYViewController.h #import <UIKit/UIKit.h ...

  4. 点击UITableView的cell展开收缩

    首先要理解UITableView代理方法调用的先后顺序. 当初始化UITableView后,代理回调顺序如下 1://返回cell个数 - (NSInteger)tableView:(UITableV ...

  5. UITableView 重用cell方法edequeueReusableCellWithIdentifier,出现错误

    UITableView 使用重用cell方法edequeueReusableCellWithIdentifier,出现错误: *** Terminating app due to uncaught e ...

  6. iOS开发总结-UITableView 自定义cell和动态计算cell的高度

    UITableView cell自定义头文件: shopCell.h #import <UIKit/UIKit.h> @interface shopCell : UITableViewCe ...

  7. iOS swift UITableView的cell被点击或是用代码选中其中的UIImageView会显示Highlighted效果

    文章目录 1.展示 2.cell的代码选中不能用cell.isSelected,而要用tableView.selectRow( 1.展示 2.cell的代码选中不能用cell.isSelected,而 ...

  8. UI一揽子计划 10 (UITableView 中cell 的编辑, 增加, 删除、UITableViewController 、)

    一.tableView的编辑 tableView 编辑的步骤:    *  1. 让tableView成为可编辑状态       编辑按钮触发方法    *  -1. 激活编辑状态 - (void)r ...

  9. Swift之动态适配UITableView的cell高度

    首先在Xib中拖一个UITableView,让其充满整个视图控制器,并遵守实现UITableViewDelegate,UITableViewDataSource协议: 其次,新建一个继承于UItabl ...

最新文章

  1. 第二百二十节,jQuery EasyUI,Slider(滑动条)组件
  2. Kubelet源码分析(一):启动流程分析
  3. 李洪强和你一起学习前端之(8)浮动,网页布局,定位
  4. false sharing
  5. [蓝桥杯]算法提高 第二点五个不高兴的小明(记忆化搜索||动态规划)
  6. Asp.Net Core 2.2.0-preview1已经发布
  7. 又一大波机械动图来了,工作原理都能看明白!
  8. 定时休眠 linux,linux系统编程手册 定时器和休眠
  9. 向SqlParameter内动态添加参数
  10. 黑苹果内置硬盘识别成外置硬盘_空间大?安全更重要,麦沃 K35274D硬盘阵列盒使用体验--数据无价...
  11. python系列笔记--耗子(巨细)
  12. MySQL慢SQL探究
  13. Java面试题(六)腾讯Spring夺命7连问(灵魂拷问)
  14. Chrony -实现NTP时间同步
  15. 【实践】Stm32f10x_74Hc595倒计时实现实例
  16. Git extensions配置
  17. python视频操作——python实现将视频分解为图片序列
  18. 四个关键词解读08下半场
  19. 杜绝陌生人进出小区 人脸识别有奇招
  20. 今天搞了个天猫抽奖机器人,祝大家都能中奖!

热门文章

  1. SQL中的布尔型变量
  2. 【读论文】DIVFusion: Darkness-free infrared and visible image fusion
  3. 项目策划 文件管理系统
  4. caffe学习笔记31-理解全连接层
  5. matlab后退和前进的快捷键,MATLAB 常用操作命令和快捷键
  6. 男教师的着装面试礼仪
  7. jquery禁用右键、文本选择功能、复制的代码
  8. 机器学习cae_智铸超云——适创科技为压铸企业量身定制的专业CAE云平台
  9. 〔转载〕从蓝色巨人到四海一家 IBM品牌塑造及转型
  10. mysql sys模式_mysql8 参考手册-sys模式存储过程diagnostics()过程