如果UITableView中没有可重用的单元格,该怎么办?

时间:2012-02-02 17:45:35

标签: iphone ios uitableview

任何人都可以告诉我,如果我有大量的细胞,管理UITableView的正确方法是什么?每个单元格的界面取决于各个部分(每个单元格在其内容视图中保留不同的UI元素)。我不想使用可重复使用的细胞,因为它会重叠。

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
 if (cell == nil) {
     cell = [[[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault nil] autorelease];

 } else {
    cell = nil;
    [cell release];
    cell = [[[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault nil] autorelease];
 }

3 个答案:

答案 0 :(得分:5)

不,您的代码不正确。首先,它甚至不会编译,因为[[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault nil]不是有效的语法。其次,[cell release];行没有效果(这很好,因为如果它有,那就错了)但它的存在表明你还没有理解内存管理概念。(/ p>

第三,也是最重要的一点,你绝对应该使用表视图的单元重用,特别是如果你有一个大表。如果您有不同类型的单元格,只需为它们使用不同的重用标识符,没问题。然后,表视图将创建多个重用池,并始终在dequeueReusableCellWithIdentifier:中返回您要求它的类型的单元格。

答案 1 :(得分:4)

我在我的应用中使用可重复使用的单元格。我正在使用的方法如下:

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellIdentifier";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}


NSUInteger row = [indexPath row];

cell.textLabel.text = [yourArray objectAtIndex:row];

return cell;
}

工作正常。

答案 2 :(得分:2)

如果没有reuseIdentfier,您将快速耗尽内存并且tableview将滚动缓慢。您应该在此方法中更改单元格的内容,例如标题,图像等,但不是视图。因此,为您需要的每个部分创建单元格的子类。设置他们的视图并在此方法中设置内容。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault 
                              reuseIdentifier:CellIdentifier] autorelease];

} else {
    cell.title = [_cellTitles objectAtIndex:indexPath.row];
    cell.image = [_cellImages objectAtIndex:indexPath.section];
}