dequeueReusableCellWithIdentifier:即使在创建单元实例后也返回nil

时间:2013-07-10 15:08:53

标签: ios objective-c cocoa-touch uitableview

我正在尝试使用带有.xib文件的UITableView。我以前用故事板完成了它,你在动态原型中声明了一个重用id。我在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath函数中有这个代码应该可以工作:

NSString *ReuseId = @"DefaultCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ReuseId];

if (cell == nil) {
    NSLog(@"cell == nil");
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ReuseId];
}

然而,当我运行它时,而不是打印cell == nil一旦它为每一行打印它。

为什么?

感谢。

2 个答案:

答案 0 :(得分:4)

你有几行?它应该首先在iPhone上创建最多11或12。取决于桌面视图的高度和细胞的高度。

因此,如果您的行数少于视图中适合的单元格,则不会发生单元格重用,也不需要。

if (cell == nil) {
    NSLog(@"cell == nil");
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ReuseId];
} else {
    NSLog(@"We have a reused cell!");
}

尝试多次重复行并慢慢滚动。现在,每当您要在视图上滚动新单元格的第一个像素时,它应该打印“我们有一个重用的单元格!”。

答案 1 :(得分:2)

第一次打开表格视图时,将无法重复使用单元格,因为所有单元格都将在实际使用中。当您开始滚动表格时,单元格开始被重用,并且一些单元格开始从顶部消失。

<强>更新

假设您有一个可以部分显示6行(5.5高)的表格视图。当UITableViewController加载带有单元格的表时,它会创建6个单元格实例,因为它们必须同时显示。

当您开始滚动并隐藏第一个单元格时,它会被添加到可重复使用的单元格集中。那是在创建第8个单元格时(因为第7个单元格将被创建,因为第1个单元格仍将以半高可见),第一个单元格将被重复使用。