iOS dequeueReusableCellWithIdentifier始终返回null

iOS dequeueReusableCellWithIdentifier始终返回null,ios,uitableview,Ios,Uitableview,在这一点上我真的很沮丧。将标识符为的可重用单元从队列中退出总是返回null - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWit

在这一点上我真的很沮丧。将标识符为的可重用单元从队列中退出总是返回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;
}

我做错了什么?谢谢。

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

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

您做得很好,一切都正常工作。iOS将创建足够的新单元格来填充屏幕(加上一个)。只有当
UITableView
包含的行数超过一个屏幕所能容纳的行数,然后用户滚动时,它才会开始重用这些单元格

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

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

苹果提到了性能瓶颈

重复使用电池对象分配有一个性能代价,特别是当分配必须在短时间内重复进行时,比如当用户滚动表视图时。如果重用单元而不是分配新单元,则可以极大地提高表视图的性能。
你做的一切都是对的,一切都正常运转。iOS将创建足够的新单元格来填充屏幕(加上一个)。只有当
UITableView
包含的行数超过一个屏幕所能容纳的行数,然后用户滚动时,它才会开始重用这些单元格

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

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

苹果提到了性能瓶颈

重复使用电池对象分配有一个性能代价,特别是当分配必须在短时间内重复进行时,比如当用户滚动表视图时。如果重用单元而不是分配新单元,则可以极大地提高表视图的性能。
当您测试tableView总是返回null时,它有多少行?只有1个部分,
numberofrowsinssection
返回5个。控制台输出“INIT”5次:(只有当一行由于滚动而不可见时,单元格才被重用。然后,该单元格被重用为其他行(现在可见)行。如果你只有5行,这可能永远不会发生。问题出在哪里?@AlexTaylor:我想你在询问行数时就考虑到了这一点。也许你想发布一个答案。当然,你得到了@MartinHow当你测试tableView时,它有多少行总是返回空值?只有1个section和
numberOfRowsInSection
返回5。控制台将输出“INIT”5次:(只有当一行由于滚动而不可见时,才会重用单元格。然后,该单元格将被重用为其他行(现在可见)行。如果你只有5行,这可能永远不会发生。问题出在哪里?@AlexTaylor:我想你在问行数的时候就想到了这一点。也许你想发布一个答案。当然,你明白了@MartinRI没有使用IB,是的;我正在用
initWithStyle:reuseIdentifier:
初始化我的单元格。我没有使用是的,我正在用
initWithStyle:reuseIdentifier:
初始化我的单元格。谢谢Alex!刚刚测试了你的理论,你是正确的。我假设数据源小到5,我控制台中的输出将显示“init”一次并重复使用同一个单元格4次。做得很好。单元格重复使用的主要目的是在不牺牲大量内存的情况下提供性能提升。谢谢Alex!刚刚测试了你的理论,你是正确的。我假设,如果数据源小到5,我控制台中的输出将显示“INIT”一次重复使用同一个单元4次。做得很好。单元重复使用的主要目的是在不牺牲大量内存的情况下提高性能。