捉襟见肘之UITableViewCell重用引发的问题
我记录一下自己如何解决cell内容重叠的问题
首先,复习一下:http://blog.csdn.net/omegayy/article/details/7356823
UITableViewCell的重用,一般根据TableView同时显示在界面中的cell个数来分配内存,当然前提是,cell都是共用一个reuseIdentifier。
这样就会导致自定义cell.contentView中加载的一些subView会重叠。我是出现了这样的情况:
因为cell是重用的,cell.contentView的subView都是被保留的,所以在用reuse cell 的时候,记得,删除cell中contentView中的子视图
第一种方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString * reuseIndentifier = @"FindCommentCell"; FindCommentCell * cell = [tableView dequeueReusableCellWithIdentifier:reuseIndentifier]; if (!cell) { cell = [[FindCommentCell alloc] initWithreuseIndentifier:reuseIndentifier]; } else { while ([cell.contentView.subviews lastObject] != nil) { [(UIView *)[cell.contentView.subviews lastObject] removeFromSuperview]; } } return cell; }
首先,通过第一种方法,我可以根据资料和我测试的结果学习如下几点:
(1) reuse 的cell 有些已经加载号一些视图的,如果想重新显示他们,有必要清楚其中的数据,或者说,重新赋新数据,所以第一种方法,其实简单粗暴,就是直接remove掉了,然后让你从新addSubView
(2)通过第一种方法,得出很多弊端,让我再一次反思了UI上,应该是创建UI和赋值数据是应当完全分开处理的
(3)让我再一次理解tableView的cell复用机制,cell其实是队列,先进的先出,然后被复用,再进入,按照单一的方向来说。
随后,我给出我自己的第二种方案
2.第二种方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString * reuseIndentifier = @"FindCommentCell"; FindCommentCell * cell = [tableView dequeueReusableCellWithIdentifier:reuseIndentifier]; if (!cell) { cell = [[FindCommentCell alloc] initWithreuseIndentifier:reuseIndentifier]; } [cell setModel:_commentArray[indexPath.row] Height:_commentHeightArr[indexPath.row]]; return cell; }
XX-ViewController
- (void)setModel:(FindCommentUserModel *)model Height:(NSArray *)contentSize { _model = model; _sizeArr = contentSize; [self.contentView addSubview:self.userHeader]; [self.contentView addSubview:self.userName]; [self.contentView addSubview:self.userTime]; [self.contentView addSubview:self.content]; [self setUp]; }
FindCommentCell
#pragma mark - Getter - (UIImageView *)userHeader { if (!_userHeader) { _userHeader = [[UIImageView alloc] initWithFrame:CGRectZero]; _userHeader.image = [UIImage imageNamed:@"test.jpg"]; _userHeader.userInteractionEnabled = YES; } return _userHeader; } ... ... ... ...
FindCommentCell - Getter
- (void)setUp { _userHeader.frame = CGRectMake(FC_PADDING, FC_PADDING, FC_Header_W, FC_Header_W); _userName.frame = CGRectMake(CGRectGetMaxX(_userHeader.frame)+FC_PADDING, FC_PADDING, , font_findZone_content_size - ); _content.frame = CGRectMake(CGRectGetMaxX(_userHeader.frame) + FC_PADDING, CGRectGetMaxY(_userName.frame) + .f, [_sizeArr[] floatValue], [_sizeArr[] floatValue]); _userName.text = _model.userName; _content.text = _model.content; }
FindCommentCell - SetUp
最终两种方案的结果:
感觉是时候用storybord 或者 第三方约束了,且学且珍惜
捉襟见肘之UITableViewCell重用引发的问题的更多相关文章
- 你真的了解UITableViewCell重用吗?
一:首先查看一下关于UITableViewCell重用的定义 - (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentif ...
- ios UITableViewCell重用问题
在写sina 微博界面的过程中使用到了cell,那么就是在cell上添加一些控件,但是由于每条微博的内容都是不同的,所以在显示的过程中,出现了内容重叠的问题,其实就是UITableViewCell重用 ...
- UITableViewCell重用的问题
UITableView中有两种重用Cell的方法: - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier; - (id)dequ ...
- UITableViewCell重用机制
UITableView是iOS开发中使用频率非常高的一个控件,它常被用来展示信息列表,尽管信息数据可能非常多,但UITableView消耗的资源却并不会随着展示信息的增多而变大,这都要得益于UITab ...
- 禁用UITableViewCell 重用机制
有时候不想让Cell重用,怎么办勒.接下来介绍两种方法 方法一 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAt ...
- UITableviewCell 重用内存
转载自:http://www.cnblogs.com/tangbinblog/p/3371545.html 重用实现分析 查看UITableView头文件,会找到NSMutableArray* vi ...
- 有关UITableviewCell 重用内存 内部解析
重用实现分析 查看UITableView头文件,会找到NSMutableArray* visiableCells,和NSMutableDictnery* reusableTableCells两个结构 ...
- UITableViewCell重用导致内容混乱方案
UITableViewCell *cell=nil; static NSString *reuse=@"cell"; if (cell==nil) { cell=[[UITable ...
- iOS解决cell重用问题
在写sina 微博界面的过程中使用到了cell,那么就是在cell上添加一些控件,但是由于每条微博的内容都是不同的,所以在显示的过程中,出现了内容重叠的问题,其实就是UITableViewCell重用 ...
随机推荐
- 为什么带网格(mesh)的模型添加了刚体Rigidbody和MeshCollider,还是会从地板穿过去?
两个Gameobject 放置在空中, 一个是Cube,一个是茄子模型 Cube的Collider 是Box Collider , 茄汁的Collider 是mesh collider, 他们都添加了 ...
- redis连接数
1.应用程序会发起多少个请求连接?1)对于php程序,以短连接为主.redis的连接数等于:所有web server接口并发请求数/redis分片的个数.2)对于java应用程序,一般使用JedisP ...
- 通过UserAgent判断设备为Android、Ios、Pc访问
public static bool CheckAgent() { bool flag = false; string agent = HttpContext.Current.Request.User ...
- 37-wc 简明笔记
显示行数.单词数和字节数 wc [options] [file-list] 参数 file-list是wc分析的一个或多个文件的路径名列表.如果省略file-list,wc就从标准输入中读取输入 选项 ...
- java中的@Override标签,小细节大作用
转载:http://www.cnblogs.com/octobershiner/archive/2012/03/09/2388370.html 一般用途 ...
- git介绍
简介:Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件.Git ...
- 使用D3绘制图表(6)--竖直柱状图表
竖直柱状图的绘制是在水平柱状图的基础上修改的. 1.html代码 <!DOCTYPE html> <html> <head> <meta charset=&q ...
- android时区
<timezones> <timezone id="Pacific/Majuro">马朱罗</timezone> <timez ...
- (01)javascript 数据类型
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- elasticsearch和hadoop集成,gateway.type hdfs设置
配置elasticsearch的存储路径为hdfs需要两步,安装插件 elasticsearch-hadoop,在联网的情况下在命令窗口运行:plugin -install elasticsearch ...