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

本文通过对比两种不同的实现方式,详细解析了UITableViewCell复用问题及其导致的字体叠加现象,旨在帮助开发者更好地理解和优化UITableView的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多朋友觉得UITableViewCell复用问题很难处理,百思不得其解,甚至有很多朋友自己琢磨很久也不明白个究竟。现在分享一下个人的一些经验,希望对大家有帮助,如果有好的意见或者有不同的看法也可以提出来,让我们一起分享一起进步,知识只有在分享的情况下才能实现它的最大价值。好了,废话少说,直奔主题了。列举两个场景对比一下,

例1:
  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  static NSString *CellIdentifier = @"cell1";
  UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
  cell = [UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
  UILabel *labelTest = [UILabel alloc]init];
  [labelTest setFrame:CGRectMake(2, 2, 80, 40)];
  [labelTest setTag:1];
  [cell addSubview:labelTest];
  }
  UILabel *label1 = (UILabel*)[cell viewWithTag:1];
  [label1 setText:[self.tests objectAtIndex:indexPath.row];
  return cell;
  }
例2:
  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{
  static NSString *CellIdentifier = @"cell1";
  UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
  cell = [UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
  }
  UILabel *labelTest = [UILabel alloc]init];
  [labelTest setFrame:CGRectMake(2, 2, 80, 40)];
  [labelTest setBackgroundColor:[UIColor clearColor]; //之所以这里背景设为透明,就是为了后面让大家看到cell上叠加的label。
  [labelTest setTag:1];
  [cell contentView]addSubview:labelTest];
  [labelTest setText:[self.tests objectAtIndex:indexPath.row];
  return cell;
  }
  当你上下来回滑动tableview的时候就会看到区别,第一种程序界面不会出现异常,但是第二种就不是了,会出现字体叠加现象,其实更确切的是多个label的叠加。为什么呢,因为在tableview刷新的时候,如果那个位置已经有现成的cell,它就不会再重新请求资源生成新的cell了,而是复用原来的cell。所以对于对于第一种,代码的思路是第一次在cell不存在的时候生成cell,定义cell样式,以后不管是刷新还是重新请求还好,它都只是复用已生成的cell。而第二种思路是,在cell不存在的时候,请求生成cell,然后给cell上添加label,刷新的时候,会复用已有的cell,但是会重复添加label,故造成重叠的现象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值