为什么在制作自定义表格视图单元格时将可重复使用的单元格两次出列

时间:2012-08-04 06:44:14

标签: objective-c ios uitableview

我正在学习使用故事板制作自定义表格视图单元格的教程。我将UILabel作为单元格的子视图拖动并将其标记设置为1.我对数据源代码有两个问题。

  1. 第二次出列声明的目的是什么?我知道这是一种init方法,而不是使用storyboard来制作自定义单元格。

  2. tableview和self.tableview有什么区别?

    -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
    {
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        }
        NSDictionary *dToAccess = (self.tableView==tableView)?[self.arForTable objectAtIndex:indexPath.row] : [self.arForSearch objectAtIndex:indexPath.row];
        [(UILabel*)[cell viewWithTag:1] setText:[dToAccess valueForKey:@"name"]];
        [(UILabel*)[cell viewWithTag:2] setText:[dToAccess valueForKey:@"value"]];
        return cell;
    }
    

3 个答案:

答案 0 :(得分:4)

对于你的第一个问题,第二个dequeueReusableCellWithIdentifier:看起来像是一个错误。

以下是UITableView的工作原理:

您的表中可能有50行,但如果一次只能看到10行,则只需要生成10个单元格,然后当用户滚动时,您可以重复使用已脱离屏幕而不是始终释放的单元格他们并启动了屏幕上出现的新细胞。 UITableView会保留已离开屏幕的单元格列表,当您调用dequeueReusableCellWithIdentifier:时,它会将其从屏幕外单元格列表中删除并将其返回给您。从这里,您可以自定义单元格以便重复使用(更改其文本,颜色等)并将其返回。同样,这不是一个“init”方法,它返回一个预先存在的单元格。

所以,让我们来看看首次显示这个UITableView时会发生什么 - 在这个例子中有10个可见单元格,因此tableView将调用tableView:cellForRowAtIndexPath:10次以使单元格显示在这10个插槽中。每次调用它时,您都需要初始化并返回一个新的UITableViewCell来显示。 (此时dequeueReusableCellWithIdentifier:将返回nil,因为您还没有任何屏幕外单元可以重复使用)

当用户滚动列表时,单元格将开始脱屏,并且需要显示新单元格。您不需要创建新单元格,因为您已经创建了一次需要在屏幕上创建的单元格。您应该调用dequeueReusableCellWithIdentifier:来获取对已经离屏的单元格的引用,然后您可以重复使用它。

我会改变你的代码:

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault
                                   reuseIdentifier: CellIdentifier] autorelease];
}

现在,您需要在创建新单元格之前检查可重复使用的单元格。

关于第二个问题,

在您的示例中,tableView引用传入的tableView(请参阅方法签名中的“tableView”)。另外,如果你的类定义了一个名为tableView的属性,那么self.tableView将为这个属性调用getter。

答案 1 :(得分:1)

当苹果为第一部iphone开发UITableView时,他们在滚动浏览时会遇到性能问题。然后,一位聪明的工程师发现造成这种情况的原因是物品的分配带来了代价,因此他提出了一种重复使用细胞的方法。

dequeueReusableCellWithIdentifier方法用于返回已标记为可以重用的单元格。

因此,只要表视图中有很多行,并且您要滚动它,那么在滚动之前刚刚从前一个屏幕传递的单元格将被重用而不是创建新的单元格。

知道你的第二个问题的答案。我想你应该参考这个链接:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/17669-when-use-self-objectname-just-objectname.html

答案 2 :(得分:0)

没有必要出列两次,这段代码被破坏了。