[trans] How to Reuse TableViewCell

2023-11-23 03:32
文章标签 trans reuse tableviewcell

本文主要是介绍[trans] How to Reuse TableViewCell,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.cnrainbird.com/index.php/2012/03/20/guan_yu_uitableview_de_cell_fu_yong_tan_tan_wo_de_yi_xie_xin_de/

 

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 = UITextAlignmentCenter;
  }
  
  cell.textLabel.text = _text;

再运行试一下,是不是怎么上下拖动也不报错了:)

完整工程下载:
UITableViewCellReuse
当然了除了以上提到的两点,UITableView还有很多比你想的要优秀的地方没有提到,以后有机会有一一表述。

 

这篇关于[trans] How to Reuse TableViewCell的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/415051

相关文章

openGuass之CTE Reuse

一. 前言 ​     CTE 是指with的公共表达式,如下所示是个CTE样例: ​       CTE表达式往往在同一条sql中多次被重复引用,如上图所示的cte被引用了两次(c1 和 c2),我们称为2个CTE实例。 ​       本文只要讲述在openGuass中,在sql中同一个CTE被多次引用时,数据是如何进行缓存和Reuse的。如上所示cte的c1和c2两个实例进行数据读

【读论文】Trans系列知识表示学习方法梳理

最近要做一个知识库问答系统,再加上对表示推理有了一点不知道对错的想法,于是翻出来知识表示学习经典的Trans系列,把论文里描述的模型和清华THUNLP提供的Tensorflow版程序一起看。 一点关于知识表示学习的背景知识 知识图谱通常是用一个三元组(前件h,关系r,后件t)来表示一条知识,比如:(中国科学院大学,地点,北京),要使用向量表示的话,可以使用one-hot向量(实际使用中

rigid_trans_object_model_3d----------对3D对象模型应用刚性3D转换

Description rigid_trans_object_model_3d对3D对象模型应用刚性3D变换,即旋转和平移,并返回转换后的3D对象模型的句柄。转换由Pose中给出的姿态来描述,形式如下,其中mcsi表示输入对象模型的坐标系,cst表示转换后模型的坐标系,例如,场景的坐标系(请参见转换/姿态和“解决方案指南III-C - 3D视觉”)。姿态可以使用create_pose、pose_

tableViewCell小结

字符串的大小有个方法可以计算的   - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode 我们还可以使用 加载完数据之后再调用以下方法 [tableView beginUpdate] [tableV

iOS tableViewCell数据显示错乱的解决方案

UITableView继承自UIScrollview,是苹果为我们封装好的一个基于scroll的控件。上面主要是一个个的UITableViewCell,可以让UITableViewCell响应一些点击事件,也可以在UITableViewCell中加入UITextField或者UITextView等子视图,使得可以在cell上进行文字编辑。 UITableView中的cell可以有很多,一般会通

揭秘 IEEE/ACM Trans/CCF/SCI,谁才是科研界的王者?

会议之眼 快讯 在学术探索的浩瀚星海中,每一篇论文都像是一颗璀璨的星辰,而那些被顶级期刊或会议收录的论文,则无疑是最耀眼的几颗。 在众多评价标准中,IEEE/ACM Transactions、CCF推荐期刊和会议、SCI分区期刊,它们各自扮演着怎样的角色,又如何影响着科研工作者的职业发展呢?今天,我们就来深入探讨这些学术界的“王者”们。 IEEE/ACM Transactions:技术前

书籍推荐|经典书籍ic书籍REUSE METHODOLOGY MANUALFOR等和verilog网站推荐(附下载)

大家好,今天是51过后的第一个工作日,想必大家都还没有完全从节假日的吃喝玩乐模式转变为勤勤恳恳的打工人模式,当然也包括我,因此这次更新主要是分享几篇书籍和verilog相关的学习网站~ 首先是一本数字电路相关的基础书籍,《数字电子技术基础》是一门介绍数字电子技术基本原理、基本方法和基本技能的课程。它主要研究各种集成器件以及逻辑门电路、集成芯片功能并进行其应用。具体内容包括数字电路的基本概念、数字

boost::asio::ip::tcp::acceptor::reuse_address

boost::asio::ip::tcp::acceptor::reuse_address 是一个选项,用于设置 tcp::acceptor 对象是否可以在绑定到一个地址后立即重新使用该地址。 在网络编程中,当服务器程序关闭后,操作系统可能会保留 socket 使用的地址一段时间。在这段时间内,如果你的服务器立即重启,尝试再次绑定到同一个地址,会导致 "地址已在使用" 的错误。设置 reuse_

设计模式:合成复用原则(Composite Reuse Principle,CRP)介绍

合成复用原则(Composite Reuse Principle,CRP)是面向对象设计原则之一,它强调通过组合已有的对象来实现新的功能,而不是通过继承已有的类来实现。合成复用原则的核心思想是尽量使用对象组合而不是类继承,从而使系统更加灵活、可复用和可维护。 该原则的实现原理可以通过以下几点来说明: 通过组合实现代码复用: 将已有的类组合在一起,形成一个新的类,新的类可以通过调用组合类的

Python: Create - Modify - Reuse

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。 http://blog.csdn.net/topmvp - topmvp Aimed at all levels of Python developers who are interested in a task-based way of learning Python deve