- (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 alloc] initWithArray:cell.contentView.subviews];
for (UIView *subview in subviews) {
[subview removeFromSuperview];
}
[subviews release];
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都释放掉,伤不起啊,没文化,太可怕了