2013-05-02 58 views
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; 
} 

我已经读过一本书,说cell是一种“可重用视图”。我在理解“可重用”时遇到了一些问题。UITableViewCell - 了解“可重复使用”

任何人可以在大约细胞的机制,一个简单的方法解释一下吗?

回答

10

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

所以,当表格视图需要显示一个新的单元格时(因为用户已经滚动了视图),它需要一个单元格离开可见区域,并将其排队回到最后,重新使用它。

+0

感谢乌尔样的回答;) – JackieLam 2013-05-02 05:02:32

+1

+1非常给点答案:) – Anupdas 2013-05-02 06:10:02

1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *[email protected]"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行从返回50,cellForRow。我们可以看到,table view只创建了11个单元格(0-15)。当你向上/向下滚动tableView重用已经创建的单元格。这种表视图的可重用机制可以节省大量内存。它不会产生取消不必要的电池,始终重用非可见细胞

+0

THX乌拉圭回合善良和耐心的解答简单;)这是真的,每当我滚动表,此方法将被调用?而频繁的调用会对CPU有很大的负担,不是吗? – JackieLam 2013-05-02 05:01:16

+0

雅显然。每当您滚动表格视图时,__cellForRow__方法都会调用,以便tableView可以请求可见单元格。在那里你可以让细胞出列。如果你不重复使用,它会重复创建单元格。然后关于CPU上的负载,假设你有1000个单元,你创建了所有的单元并存储在内存中以避免重复调用__cellForRow__(假设)内存怎么样?将成为记忆的负担..对吗?所以表格视图重用比这要好得多。不需要考虑几个方法调用。 – 2013-05-02 05:12:24

+0

这很清楚,很棒! – JackieLam 2013-05-02 05:24:21

1

除了H2CO3,正如你可以看到你已经使用了一个名为reuseIdentifier变量,使用的是下面几行:

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

所以让一行一行地去:

  • 第一行指定一个静态的标识符,这样它只会被构造一次。如果它不是静态的,你会在每次发送消息时发送一个消息(这是很多),因为 Lou Franco说。

  • 然后来的importent线,第二个,包含dequeueReusableCellWithIdentifier。这种方法加载出列不再可见的单元格,就像双向链表一样,这确保了不在视图中的单元格的可重用性(这意味着只有那些单元格保留在内存中,这对您而言是可见的,这就是的可复用性 )。

  • 现在你可以看到'if block'是做什么的,如果没有单元出队,那么它会创建一个新的单元,并且当它不再可见时它就可以被重用。

最后,你不必理会这其中细胞可享有重用,一流的tableView相对于的tableView帧尺寸和单元格高度计算。

+0

thx for ur kind and patient answer;)每当我滚动表格时,这种方法会被调用吗?而频繁的调用会对CPU有很大的负担,不是吗? – JackieLam 2013-05-02 04:59:02

+0

你是对的,它会但CPU利用率与内存相比是好的,因为内存是有限的,然后CPU就会休息。 – rptwsthi 2013-05-02 05:33:22

5

一些事实

  1. 所有,在表中可见的细胞有它的一个UITableViewCell
  2. UITableView只放细胞的可重复使用的队列中,当他们去视觉窗外。
  3. 第一次使用Nib文件加载表格中的所有可见单元格(7,8,10次,具体取决于单元格的高度)。
  4. 一旦开始滚动表格,UITableView开始将UITableViewCells放入可重用的队列中,并且可以在表格的其他位置重新使用。

    为什么这种行为没有在dequeueReusableCellWithIdentifier引用中解释过,真是太神奇了。可能是因为很明显......这个入口是专门为那些和我一样昏暗的人而设计的。

+1

thx for ur kind and patient answer;) – JackieLam 2013-05-02 04:56:38