iOS开发经验分享:UITableViewCell复用问题

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

  例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 setBackgroundColor:[UIColor clearColor];

  [labelTest setTag:1];

  [cell contentView]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,故造成重叠的现象。

  之前类似的问题来回困扰了我好多次,我都没有下决心彻底搞清楚,每次都是得过且过,只要程序最好调好了,就OK。今天又碰到了类似的问题,终于大致搞清楚了,希望以后不会再被它坑害。

  上面分享的是个人的心得,希望大家有好的知识,有干货也分享出来,让我们一起学习,一起进步。当然,希望我分享的这些小知识能够帮助到大家,帮助到大家是我最大的满足。作者信息:师从无限互联陈为老师

时间: 2024-11-10 07:23:59

iOS开发经验分享:UITableViewCell复用问题的相关文章

IOS开发经验分享

一些IOS开发的心得: 1) [Multiple Threads] IOS多线程注意, 所有的UI操作都必须在主线程上: Any code that will update the UI should be done on the main thread. Data loading should typically be done in some background thread. 示例: [self performSelectorOnMainThread:@selector(updateTh

iOS : UITableViewCell复用之自己理解

UITableViewCell复用在iOS中那是很重要的,面试多会问到,下面就说一下我自己的理解 先看一个效果 当屏幕和cell的高度一定后,屏幕先呈现可见部分,当滑动的时候,第一个将要划出页面,下一个将要进入可视页面时,此时还没有复用池中还没有标识为"ID"的cell 可复用,于是就会执行if语句,进行创建,当第一个划出屏幕时,就会被标记,放到复用池,当在开始滑动页面时,第八个(序号)要进入时这时就会走复用,第二个放到复用池,再滑动第三个进入复用池,一直到都离开就都进入复用池了,就不

iOS社交分享Twitter、Facebook、复制到剪切板、LINE、及邮件

准备 首先要引进如下三个framework: MessageUI.framework Social.framework Accounts.framework 并在实现这几个方法的地方引入以下几个头文件 #import <MessageUI/MFMailComposeViewController.h> #import <Social/Social.h> #import <Accounts/Accounts.h> Twitter及Facebook 其中urlStr为我分享的

十八年开发经验分享(07)递归程序设计

这篇谈谈递归程序设计的问题.从取名上来说是想刻意区别内容的侧重点不同.上一篇是构造,其重点是从递归程序的自身结构出发,试图用一种比较直观的方法来完成递归程序的构造.这篇的重点是设计,其中的区别在于,这次是从问题本身的结构出发来完成递归程序的开发任务.上一篇中介绍的方法,比较简单直观,八股文的意味非常浓郁,并且还有一个比较大的缺点,那就是在实际使用时往往会受制与方法本身而不能解决有一定难度的问题.实际上递归是一种客观存在的现象,递归的描述问题是对客观世界的一种认识.本文从对问题的认识,描述和分析这

开发经验分享(一)

开发经验分享系列文章主要记录工作实际项目中遇到的问题和解决办法,希望能对大家有参考意义. 一.芯片的地址分配和变量地址的指定 芯片的存储区很小,所以要合理利用存储区,在进行地址空间的分配时就需要一定的技巧. 在进行开发时,一定要做好地址的划分. 比如CODE区的0x0000~0x8000作为COS区,接下来的0x8000~0x10000作为文件系统区,依次类推…… 在定义变量的时候,也要注意定义在了什么位置,占用的空间有多大. 比如,我们在XRAM区定义变量和数组: xdata char tem

iOS 开发经验总结

iOS 开发经验总结http://www.cocoachina.com/ios/20170216/18699.html 1.cocoa pods 常用的framework 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 platform :ios, '7.0' target 'store' do pod 'AFNetworking', '~> 3.1.0' pod 'JSONKit', '~> 1.5pre' pod 'MBPr

Android开发经验分享-GridView、ListView内容错乱

在使用GridView.ListView的过程中遇到内容错乱的问题,费了较长时间才找到问题的根源,特地总结一下. 1.在自定义adapter中没有给每一项都设置内容导致内容错乱: @Override public View getView(final int position, View convertView, ViewGroup parent) { if( null == convertView ){ mGridHolder = new GridHolder( ); convertView

iOS Programming Subclassing UITableViewCell

iOS Programming Subclassing UITableViewCell? 1.Creating BNRItemCell UITableViewCell is a UIView subclass. UITableViewCell是UIView的子类. When subclassing UIView (or any of its subclasses), you often override its drawRect: method to customize the view's a

在智能电视中的实时数据呈现web开发经验分享

先上图,一睹为快. 看到图,身为资源web开发者的你,是不是在大脑中闪现出了一个个的技术名词,websocket.html5.css3(animation/transition).javascript(ajax/setTimeout/setInterval). 同样专注web开发xx年的你,有没有考虑到以下问题: 1.实时数据展现,如果采用ajax定时拉取对现有业务的影响,在DB性能这块,可能导致DB服务死去 2.采用客户端主动拉取还是服务器端的推技术,服务器推技术似乎实现起来太多麻烦,后端的配