UITableViewCell 可重用单元cell清除subViews

今天遇到了一个问题,在UITableViewCell上添加SubView后,点击状态(高亮)时,出现重叠现象,原来是UItableView的重用机制问题,解决方法:

- (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] autorelease];

}

        NSArray *subviews = [[NSArray allocinitWithArray:cell.contentView.subviews];

for (UIView *subview in subviews) {

[subview removeFromSuperview];

}

[subviews release];


     //customer 

return cell;

}


以上是原文,但是我都是直接【cell addSubView:xxx】的,所以cell.contentView.subviews------>cell.subviews




特别补充:

以上所用其实是比较特殊的一种用法,个人用法是比如有12个section,只有最后一个与其他不一样,那么可以这样用;

还有一种非常通俗化的用法:就是可重用单元的那个标记:identifier 设置成不同的名称。但是这样是否就造成了实际没有实现可重用单元呢(假如每个section、或者section里的row不一样)?


UItableView继承自UIScrollview,说白了其实就是个scroll,苹果为我们封装好的一个基于scroll的控件,里面主要是UITableViewcell,也就是一个个的小白条,高度可以设置,当然也可以自定义类继承他,避免重复的写很多东西,设置好delegate和dataSource后,在代理方法里面完成各种设定.

 以下内容转发自http://blog.csdn.net/orietech/article/details/6653974

以下说的也是我想说的,每个不同cell都开辟一个新的内存,而且关键是重用机制就不是了吧(如果每个cell都不同的话),所以想用最上面的方法清除掉每个cell 的subviews,但是发现全部内容清空了,很不理解,因为我都是每次重绘前才清空的啊

方法.- (UITableViewCell*)dequeueReusableCellWithIdentifier:(NSString*)identifier的理解

此方法可以从所有已经开辟内存的cells里面,dequeue出一个以identifier为标识的cell,个人理解。

其实这就是一种重用机制吧,避免浪费,这里可能大家遇到过一些问题,在cell上放着不同的内容,当向下拉动tableview的时候,显示出的cell居然是前面显示过的,这里其实是identifier的问题,一般都把identifier设置成一个静态字符变量,所有cell都使用的这个标识开辟,所以根据这个标识 dequeue出来的cell有可能是以前用过的cell,但是上面的内容不同,而你又忘了重新设置新的值,所以导致刷出来的cell是是之前的cell。

这种情况可以每次在代理函数里面重新设置下cell上的内容处理,但是如果每个cell的造型都不一样,而且有很大区别,比如cell的高度都不一样,如果用同一个标识dequeue出来就会有问题,那怎么处理?

当然大家应该想到了,把每一个cell都设置唯一的一个identifier,这样从cells里dequeue出来的cell就是唯一的,而且上面的值会保留,唯一的缺点就是每个cell都要开辟一个内存.()



我决定给自己个合理的借口吧先:

如果各个cell尺寸不一样,那就选用不同的identifier吧!!!!!!



终于明白了,原文是对的,应该选择view.contentview.subviews,因为如果是我所说的view.subviews的话就会把cell上的诸如textlabel都释放掉,伤不起啊,没文化,太可怕了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值