列举两个场景对比一下,也许tableviewcell的复用就很清晰明了了。

1,

 1 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
 2
 3      static  NSString *CellIdentifier =  @"cell1";
 4      UITableViewCell *cell  =[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
 5
 6     if (cell == nil) {
 7
 8        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
 9
10         UILabel *labelTest = [[UILabel alloc]init];
11
12         [labelTest setFrame:CGRectMake(2, 2, 80, 40)];
13
14         [labelTest setBackgroundColor:[UIColor clearColor]];
15
16         [labelTest setTag:1];
17
18         [[cell contentView]addSubview:labelTest];
19
20     }
21
22     UILabel *label1 = (UILabel*)[cell viewWithTag:1];
23
24     [label1 setText:[self.tests objectAtIndex:indexPath.row]];
25
26     return cell;
27
28 }        

2,

 1 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{
 2
 3      static  NSString *CellIdentifier =  @"cell1";
 4     UITableViewCell *cell  =[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
 5
 6     if (cell == nil) {
 7
 8         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
 9
10  }
11
12     UILabel *labelTest = [[UILabel alloc]init];
13
14     [labelTest setFrame:CGRectMake(2, 2, 80, 40)];
15
16     [labelTest setBackgroundColor:[UIColor clearColor]];  //之所以这里背景设为透明,就是为了后面让大家看到cell上叠加的label。
17
18     [labelTest setTag:1];
19
20     [[cell contentView]addSubview:labelTest];
21
22     [labelTest setText:[self.tests objectAtIndex:indexPath.row]];
23
24 return cell;
25 }

当你上下来回滑动tableview的时候就会看到区别,第一种程序界面不会出现异常,但是第二种就不是了,会出现字体叠加现象,其实更确切的是多个label的叠加。为什么呢,因为在tableview刷新的时候,如果那个位置已经有现成的cell,它就不会再重新请求资源生成新的cell了,而是复用原来的cell。所以对于对于第一种,代码的思路是第一次在cell不存在的时候生成cell,定义cell样式,以后不管是刷新还是重新请求还好,它都只是复用已生成的cell。而第二种思路是,在cell不存在的时候,请求生成cell,然后给cell上添加label,刷新的时候,会复用已有的cell,但是会重复添加label,故造成重叠的现象。
之前类似的问题来回困扰了我好多次,我都没有下决心彻底搞清楚,每次都是得过且过,只要程序最好调好了,就OK。今天又碰到了类似的问题,终于大致搞清楚了,希望以后不会再被它坑害。
备注:原文地址:http://my.oschina.net/u/1378445/blog/186187

转载于:https://www.cnblogs.com/fanyufan/p/3587436.html

(转)UITableViewCell复用问题相关推荐

  1. UITableViewCell复用后,label上的字重叠的问题

    很多朋友觉得UITableViewCell复用问题很难处理,百思不得其解,甚至有很多朋友自己琢磨很久也不明白个究竟.现在分享一下个人的一些经验,希望对大家有帮助,如果有好的意见或者有不同的看法也可以提 ...

  2. 有关UITableView--cell复用问题

    近来用Tableview做了一个九宫格.过程中碰到了两个cell复用问题. 问题一: 在cell中为button添加addTarget点击事件时,出现后面的cell会重叠它前面cell的事件.代码如下 ...

  3. ios 如何在cell中去掉_iOS开发:关于 去除UITableViewCell复用机制 的几种方法

    UITableView继承自UIScrollview,是苹果为我们封装好的一个基于scroll的控件.上面主要是一个个的UITableViewCell,可以让UITableViewCell响应一些点击 ...

  4. 手把手教学IOS自定义cell-仿微信消息列表

    效果图 自定义View是一项非常有成就感的实践,如果有Android基础的同学接触起来应该会比较顺手,基本思路都差不多.项目采用原生的布局方式,实现仿微信消息列表效果,主要是学习自定义Cell,展示头 ...

  5. 深入源码 UITableView 复用技术原理分析

    在现在很多公司的 app 中,许多展示页面为了多条数据内容,而采用 UITableView 来设计页面.在滑动 UITableView 的时候,并不会因为数据量大而产生卡顿的情况,这正是因为其复用机制 ...

  6. 自定义UITableViewCell需注意的问题

    自定义cell,有下面几种方法 方法一: 在controller的.m中 1 @interface ViewController ()<UITableViewDataSource,UITable ...

  7. RxSwift之订阅UITableViewCell里的按钮点击事件

    一.前言 我们知道,通过订阅 tableView 的 itemSelected 或 modelSelected 这两个 Rx 扩展方法,可以对单元格的点击事件进行响应,并执行相关的业务代码. 但有时候 ...

  8. scrollview复用节点_利用ScrollView实现TableView效果(实现复用)

    TableView在iOS中的作用毋庸置疑,每一款App或多或少的都会使用到UITableView这个控件.作为iOS开发者,我们知道UITableView是继承自UIScrollView的,那么UI ...

  9. 关于UITableView的Cell复用谈谈我的一些心得滴水穿石

    UITableView是ios开发中使用率极高的一个控件,就我个人来说,几乎我做的每一个View上都有她的身影.但是很长一段时间,我对她的理解都很肤浅.对我来说触动较大的两个东西,一个是前面提到的自定 ...

最新文章

  1. mysql备份psb文件怎么打开_Navicat for MySQL 数据备份教程
  2. Javascript 判断网页横竖屏
  3. python常用模块大全总结-Python 常用模块大全(整理)
  4. Catalan Numbers 卡特兰数
  5. SAP中国招聘内部顾问,工作职责是做客户项目,ABAP开发
  6. 面试官 | 如何在 Spring Boot 中进行参数校验?
  7. 磁盘性能分析一:IO负载高的判断详解
  8. Windows加域提示 已超出此域允许的创建的计算机账户的最大值,请联系统管理员
  9. js金额格式化最简单方法 JS对货币格式化,js钱三位一隔,javascript货币格式化
  10. WebViewJavascriptBridge 进行js 与native通信。
  11. 22. 切勿直接修改set或multiset中的键
  12. 详尽解读中美科技差距究竟多么巨大
  13. .NET开发不可错过的25款必备工具,徐汇区网站设计
  14. 华为android9升级包,华为Mate9官方固件ROM刷机包
  15. spring boot实现邮箱验证码注册
  16. 使用C#编写17种Hello World程序(初学者C#测试石)
  17. 攻防世界 misc 打野
  18. 人工智能必备数学基础--精华笔记
  19. 【贝叶斯神经网络训练】(torch实现)
  20. meanShift算法介绍

热门文章

  1. 两种IO模式:Proactor与Reactor模式
  2. 十分钟入门RocketMQ
  3. JVM插码之五:Java agent+ASM实战--监控所有方法执行时间
  4. python执行js文件
  5. hadoop集群中datanode启动几秒钟自动关闭
  6. solr源码导入eclipse
  7. 服务化实战之 dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型
  8. 机器学习中的数据预处理(sklearn preprocessing)
  9. 结合电商支付业务一文搞懂DDD
  10. JVM调优系列:(三)类加载和执行机制