捉襟见肘之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重用 ...
随机推荐
- Node进阶:核心模块http简介
本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. http模块概览 大多数nodejs开发者都是冲着开发web s ...
- 171 Excel Sheet Column Number
/** * 题意:A表示1 B表示2 AA表示27 AB表示28 ------>给你一串字符串输出相应的数字 * 分析:这个就类似于二进制转十进制,从字符串后面往前遍历,然后pow(26,n)* ...
- 深入理解计算机系统(1.2)---hello world的程序是如何运行的
在写本章的内容之前,LZ先做个小广告.其实也不算是什么广告,就是LZ为了和各位猿友交流方便,另外也确实有个别猿友留言或者在博客里发短消息给LZ要联系方式.因此LZ斗胆建立了一个有关<深入理解计算 ...
- 链接错误-库冲突(libcmt.lib和libcmtd.lib)
在同一个项目中,所有的源文件必须链接相同的C运行时库.如果某一文件用了Multithreaded DLL版本,而其他文件用了Single-Threaded或者Multithreaded版本的库,也就是 ...
- 东大OJ 2SAT 异或
看了十年才懂懂了十年才会会了十年才会写写了十年才写完写完了十年才能改对 #include<stdio.h> #include<string.h> struct res{ int ...
- oracle操作记录
由于之前建的job过多,造成数据库cpu占用率达到99%,造成需要的job崩溃. 以下为解决方案: 1. 查询当前的job列表 : select * from user_jobs; 2. 暂停所有的j ...
- Android NestedScrolling嵌套滑动机制
Android NestedScrolling嵌套滑动机制 最近项目要用到官网的下拉刷新SwipeRefreshLayout,它是个容器,包裹各种控件实现下拉,不像以前自己要实现事件的拦截,都是通过对 ...
- linux下使用 du查看某个文件或目录占用磁盘空间的大小
du -ah --max-depth=1 这个是我想要的结果 a显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小但是由于用了--max-depth选项,表示显示目录下所有 ...
- JQuery触发radio或checkbox的change事件
在JQuery中,当给radio或checkbox添加一个change事件时,如果它的值发生变化就会触发change事件;本文将详细介绍如何利用JQuery触发Checkbox的change事件需要了 ...
- 去掉谷歌浏览器获取焦点时默认的input、textarea的边框和背景
去掉chrome(谷歌)浏览器默认的input.textarea的边框(border)和背景(background) 及chrome下不可更改textarea大小 1.使用Chrome的都知道,当鼠标 ...