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

        NSManagedObject *manageObject = [self.fetchResultController objectAtIndexPath:indexPath];
        cell.textLabel.text = [manageObject valueForKey:@"title"];
        cell.detailTextLabel.text = [manageObject valueForKey:@"subtitle"];

        return cell;
}

我从一本书中读到单元格是一种“可重复使用的视图”。我在理解“可重用”方面有一些问题。

有人可以简单地解释一下细胞的机制吗?

4

4 回答 4

13

问题:一个表视图可能有数千行(或数百万行,等等)。为每个数据行创建一个单独的单元格将是乏味和浪费的。相反,表格视图只要求同时显示在屏幕上的行数(通常不超过 10-15-20 个单元格)。这是易于管理的,不会消耗大量内存,并且由于并非所有行都在显示器上可见,因此效果很好。

因此,当 table view 需要显示一个新单元格时(因为用户已经滚动了视图),它会获取一个超出可见区域的单元格,并将其排回末尾,重新使用它。

于 2013-05-02T03:57:51.643 回答
6

一些事实

  1. 表中可见的所有单元格都有一个UITableViewCell
  2. UITableView它们超出可视窗口时,唯一将单元格放入可重用队列中。
  3. 第一次使用 Nib 文件加载表格中的所有可见单元格(7,8,10 次,取决于单元格的高度)。
  4. 一旦你开始滚动表格,UITableView 就会开始放入UITableViewCells可重用队列,并且可以在表格的其他位置重用。

    为什么在 dequeueReusableCellWithIdentifier 参考中没有解释这种行为真的很神奇。可能是因为很明显……这个条目是献给像我一样昏暗的人的。

于 2013-05-02T04:49:12.220 回答
1

除了 H2CO3,如您所见,您使用了一个名为的变量reuseIdentifier,并且正在使用以下行:

static NSString *reuseIdentifier = @"cellReuse";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
}

因此,让我们逐行进行:

  • 第一行指定一个静态标识符,因此它只会被构造一次。正如Lou Franco所说,如果它不是静态的,那么每次发送消息时都会制作一个(很多) 。

  • 然后是重要的第二行,它包含dequeueReusableCellWithIdentifier. 此方法加载不再可见的单元格,就像双向链表一样,确保不在视图中的单元格的可重用性(这意味着只有那些单元格保留在内存中对您可见,这就是可重用性)。

  • 现在您可以看到“if block”的作用是,如果没有要出列的单元格,那么它会创建新的单元格,reuseIdentifier以便在不再可见时可以重用它。

最后,您不必担心哪个单元格有资格重复使用,tableView 类会根据 tableView 框架大小和单元格高度计算它。

于 2013-05-02T04:22:44.100 回答
1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     NSString *cellID=@"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
  if (cell == nil)
  {
       cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
       cell.textLabel.text= [NSString stringWithFormat:@"%d", indexPath.row];
  }
  else
  {
     cell.textLabel.text = @"reused";
  }

  return cell;
}

要了解单元可重用性,请运行上述代码。假设我们有 50 行从cellForRow返回 50 。我们可以看到表格视图只创建了 11 个单元格(0-15)。当您向上/向下滚动时,tableView 正在重用已创建的单元格。表视图的这种可重用机制节省了大量内存。它不会创建不必要的单元格,总是重复使用不可见的单元格

于 2013-05-02T04:15:20.723 回答