iOS UITableViewCell重用问题
来源:互联网 发布:纺织erp软件 编辑:程序博客网 时间:2024/05/18 01:34
在写微博界面的过程中使用到了cell,那么就是在cell上添加一些控件,但是由于每条微博的内容都是不同的,所以在显示的过程中,出现了内容重叠的问题,其实就是UITableViewCell重用机制的问题。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static
NSString *CellIdentifier = @
"Cell"
;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if
(cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
return
cell;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static
NSString *CellIdentifier = @
"Cell"
;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if
(cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
return
cell;
}
TableView的重用机制,为了做到显示和数据分离,IOS tableView的实现并且不是为每个数据项创建一个tableCell。而是只创建屏幕可显示最大个数的cell,然后重复使用这些cell,对cell做单独的显示配置,来达到既不影响显示效果,又能充分节约内容的目的。
解决方法一:对在cell中添加的控件设置tag的方法
例如在微博内容中需要添加label,那么就可以对添加的label设置tag,然后新建cell的时候先remove前一个cell tag相同的label,再添加新的label,这样就不会出现cell内容的重叠。
1
2
[[cell viewWithTag:
100
] removeFromSuperview];
[[cell contentView] addSubview:contentLabel];
解决方法二:删除cell中的所有子视图
在实现微博界面中,一个cell会有多个控件(label,imageview...),按理说,对每一个控件都设置tag,按照第一种解决方法,应该是可以实现的。但是在实际运行过程中发现不行,还是会出现内容重叠的问题,所以采用第二种解决方法--在新建cell的时候,如果不是空就删除所有的子视图。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static
NSString *iddifity=@
"mycell"
;
UserGridTableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:iddifity];
if
(cell==nil) {
cell=[[[UserGridTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:iddifity]autorelease];
}
else
{
while
([cell.contentView.subviews lastObject] != nil) {
[(UIView*)[cell.contentView.subviews lastObject] removeFromSuperview];
//删除并进行重新分配
}
}
cell.dataArrays=[self.dataArray objectAtIndex:indexPath.row];
return
cell;
}
解决方法三: 通过为每个cell指定不同的重用标识符(reuseIdentifier)来解决。
重用机制是根据相同的标识符来重用cell的,标识符不同的cell不能彼此重用。于是我们将每个cell的标识符都设置为不同,就可以避免cell重用问题了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *CellIdentifier = [NSString stringWithFormat:@
"Cell%d%d"
, [indexPath section], [indexPath row]];
//以indexPath来唯一确定cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//出列可重用的cell
if
(cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
//...其他代码
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *CellIdentifier = [NSString stringWithFormat:@
"Cell%d%d"
, [indexPath section], [indexPath row]];
//以indexPath来唯一确定cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//出列可重用的cell
if
(cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
//...其他代码
}
0 0
- iOS UITableViewCell重用问题
- iOS UITableViewCell重用问题
- iOS UITableViewCell重用问题
- iOS UITableViewCell重用问题
- iOS UITableViewCell重用问题
- iOS UITableViewCell重用问题
- iOS UITableViewCell重用问题
- iOS UITableViewCell重用问题
- iOS- UITableViewCell重用
- UITableViewCell的重用问题
- UITableViewCell重用问题
- UITableViewCell的重用问题
- UITableViewCell重用问题
- UITableViewCell重用问题
- iOS UITableViewCell的混乱显示与重用问题
- iOS UITableViewCell重用机制避免重复显示问题
- iOS-UITableviewCell的重用机制
- iOS-UITableviewCell的重用机制
- hdu 1698 线段树-成段更新
- Android学习笔记(三)模拟器的搭建
- 22. 微软面试题:左旋字符串
- 学习笔记 --- LINUX内核里面的IS_ERR宏解析
- java 第十天 面向对象(高级篇之final与抽象类)
- iOS UITableViewCell重用问题
- Jdk1.6新特性
- js map
- java中的类!
- ThinkPHP学习(三)配置PHP5支持MySQL,连接MySQL数据库
- ORACLE 日期相关函数
- 批处理判断变量值是否为空的终极方法
- 如何调试makefile变量
- linux swap理解-为什么linux有足够的内存还进行swap