UITableViewCell重用Dobut

时间:2014-07-21 05:41:55

标签: ios objective-c uitableview reuseidentifier

我对重用UITableViewCell有点疑问。

当我们创建UITableViewCell时,它看起来就像是跟随。

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

- (void)configureCell:(UITableViewCell *)cell forIndexPath:(NSIndexPath *)indexPath
{
    switch (indexPath.section) {/**Cell Config Code Goes Here**/}
}

所以在我的例子中,UITableView中的每个单元格都不同。如果UITableView重用单元格,则单元格内容完全不同。

将CellIdentifier传递为nil是不错的做法所以每次创建新单元格而不是所有单元格都不同的情况下?

或者我应该移动[self configureCell:cell forIndexPath:indexPath];出来并由我自己处理?

3 个答案:

答案 0 :(得分:0)

我担心你必须将配置单元代码移出if条件才能使每个单元格都有自己的内容。

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

虽然我们说重用UITableViewCells,但我们的意思是我们不必每次都在单元格内创建UIView层次结构。但是您需要为不同的单元格配置内容。喜欢cell.titleLabel.text = xxxx。

同时,您可以为不同类型的单元格使用多个reuseIdentifier。或者,如果您只有一个这样的单元格,则可以将单元格定义为属性实例,这样您就不必每次都创建它。

答案 1 :(得分:0)

如果您多次使用单元格内容(相同的子视图),则可以使用单元格可重用性。就像tableViewcell中有两个用于tableView中所有行的标签一样。如果您有少量不同的细胞。就像在tableView中多次使用三种类型的单元格一样,您可以使用具有3种不同单元标识符的单元可重用性。

但是如果你有所有不同的细胞,那么如果你跳过细胞可重用性就没关系了。

答案 2 :(得分:0)

使用tableView的可重用性的正确方法如下所示。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellIdentifier = @"FollowerCell";

UITableViewCell *cell = (UITableViewCell *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (cell == nil)
{
    cell =[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
[self configureCell:cell forIndexPath:indexPath];

return cell;
}


- (void)configureCell:(UITableViewCell *)cell forIndexPath:(NSIndexPath *)indexPath
{
switch (indexPath.section) {/**Cell Config Code Goes Here**/}
}

可重用性的基本思想是,每次不应创建相似类型的单元格时,只需更新其内容即可重复使用它们。

场景背后发生的是创建了一个队列,其中添加了这些类似的单元格。现在假设有200行具有不同的数据,但只有10行可见。队列中只有大约14个单元格。现在,您将向上或向下滚动tableview,这种情况     UITableViewCell * cell =(UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

检查队列是否包含任何单元格,如果是,则从队列中取出单元格。此外,现在在消失时较早可见的单元格也被添加到队列中。这样,每次创建新单元格时,都会使用已创建的单元格。

现在,如果你强制使cell = nil,那么每次创建新单元格并将其添加到队列中时。现在,如果有200个数据,则队列将包含200个单元,从而导致内存大小增加。

希望它能帮助您理解tableView。快乐编码:)