iOS dequeueReusableCellWithIdentifier始终返回null

时间:2013-01-27 03:48:06

标签: ios uitableview

此刻我真的很沮丧。使用标识符对可重用单元格进行排队始终返回null。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil) {
        NSLog(@"INIT");
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    return cell;
}

我在这里做错了什么?感谢。

2 个答案:

答案 0 :(得分:5)

你正在做的一切正常,一切正常。 iOS将创建足够的新单元格来填充屏幕(加一)。只有当UITableView包含的行数超过一个屏幕上的行数然后用户滚动时,它才会重新开始重复使用这些单元格。

你会发现,如果你有一个数据源会说,其中有100个项目,然后滚动,你只会显示你的日志消息11次(取决于你的屏幕上有多少个单元格)而不是100因为iOS会在您滚动时开始回收单元格。

对于大型列表,它将使用太多内存为UITableView中的每个可能行创建新视图。另一种方法是在滚动时为行分配新视图。但是,这会产生性能瓶颈,导致任何UITableView中的延迟滚动。

Apple提到了性能瓶颈in their documentation on UITableViews

重用细胞。 - 对象分配具有性能成本,特别是如果分配必须在短时间内重复发生 - 例如,当用户滚动表视图时。如果重用单元格而不是分配新单元格,则可以极大地提高表格视图的性能。

答案 1 :(得分:0)

您是否设置了单元格的重用标识符?使用-initWithStyle:reuseIdentifier:初始化您的单元格,或在IB中设置标识符。