对自定义单元格使用dequeueReusableCellWithIdentifier

时间:2013-07-16 21:35:32

标签: ios objective-c cocoa-touch ios4

让我说我有

- (UITableViewCell*)tableView:(UITableView*) cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    static NSString *cellID = @"Cell Identifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];

    if (!cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    else
    {
        return cell;
    }

    UILabel * nameLabel = [[UILabel alloc] initWithFrame: CGRectMake( 0, 15, box.size.width, 19.0f)];
    nameLabel.text = name;
    [nameLabel setTextColor: [UIColor colorWithRed: 79.0f/255.0f green:79.0f/255.0f blue:79.0f/255.0f alpha:1.0f]];
    [nameLabel setFont: [UIFont fontWithName: @"HelveticaNeue-Bold" size: 18.0f]];
    [nameLabel setBackgroundColor: [UIColor clearColor]];
    nameLabel.textAlignment = NSTextAlignmentCenter;
    [cell addSubview: nameLabel];
}

这是怎么回事?

如果单元格不是nil,并且假设您在第5行,它是否会返回第5行的单元格以及确切的文本标签等?

基本上,我的问题是,如果您的自定义单元格包含标签,图片视图等。您如何将cellForRowAtIndexPathdequeueReusableCellWithIdentifier一起使用?

5 个答案:

答案 0 :(得分:3)

您尝试将单元格出列。如果尝试失败(单元格为nil),则创建一个单元格并将其配置为视图(而不是视图中的数据)。然后,使用任何更改单元格到单元格的数据或设置填充视图。此外,您应该将任何自定义视图添加到单元格的contentView,而不是单元格本身。

#define NAME_LABEL_TAG 1234

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"Cell Identifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];

    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        UILabel * nameLabel = [[UILabel alloc] initWithFrame: CGRectMake( 0, 15, box.size.width, 19.0f)];
        nameLabel.tag = NAME_LABEL_TAG;
        [nameLabel setTextColor: [UIColor colorWithRed: 79.0f/255.0f green:79.0f/255.0f blue:79.0f/255.0f alpha:1.0f]];
        [nameLabel setFont: [UIFont fontWithName: @"HelveticaNeue-Bold" size: 18.0f]];
        [nameLabel setBackgroundColor: [UIColor clearColor]];
        nameLabel.textAlignment = NSTextAlignmentCenter;
        [cell.contentView addSubview: nameLabel];
    }

    // Populate views with data and retrieve data for "name" variable
    UILabel *nameLabel = (UILabel *)[cell.contentView viewWithTag:NAME_LABEL_TAG];
    nameLabel.text = name;

    // Return fully configured and populated cell
    return cell;
}

如果您有一个复杂的单元格,通常更容易在Interface Builder和子类UITableViewCell中创建它,这样您就可以拥有引用标签,按钮等的自定义属性。

答案 1 :(得分:0)

是的,将已经添加了这些标签的单元格出列仍将具有它们及其文本,就像您在创建该特定单元格时一样。

创建一个UITableViewCell子类,让我们称之为MyTableViewCell,它具有保存标签/ imageViews / etc所需的属性。一旦你出局或分配了一个你的MyTableViewCell的init,你就可以在这些属性上设置text / images / etc。像这样:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"identifier";

    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[MyTableViewCell alloc] initWithStyle:UITableViewStylePlain reuseIdentifier:CellIdentifier];
    }



    cell.nameLabel.text = name;
    cell.imageView.image = anImage;


    return cell;
}

您的方法的一个主要问题是围绕出列和创建的条件。在您的方法中,您只在标记为“初始化”时将标记设置为单元格(您可以立即返回出列单元格而不对其进行格式化)。但是,您希望对已出列和手动实例化的单元格进行此设置。注意在我的方法中如何发生这种情况,return语句位于最底层。这将确保创建和重用的单元格都具有适当的数据。

编辑:我遗漏了一件重要的事情,您将在其initWithStyle: reuseIdentifier:方法中实例化您的单元格的属性,并将它们作为子视图添加到单元格中。当您在cellForRowAtIndexPath方法中设置标签(或其他)的文本时,就已经创建了它。基本上,单元格管理创建自己的视图,而UITableView委托只需要担心用数据填充这些视图。

答案 2 :(得分:0)

UITableView首先会询问您预期的细胞数量。然后加载通过 - tableView:cellForRowAtIndexPath:将显示的方法单元格+一些以平滑滚动,更多的对象不会创建。存储在表视图中的创建对象(按用户),您可以通过dequeueReusableCellWithIdentifier:方法访问未使用的对象。 TableView要求用户在滚动时修改当前创建的单元格。如果这里是自由对象 - 从dequeueReusableCellWithIdentifier获取它:另一个 - 创建一个新对象。

答案 3 :(得分:0)

为了不必分配每个表格单元格,表格只分配所需的内容。如果页面上只有8个单元格,那么表格视图将只分配8个单元格或9个我不记得它是否有填充。滚动表视图并且单元格离开页面时,单元格排队等待重新使用,而不是重新分配新单元格,表格视图采用现有单元格,此过程称为出列。当你创建/分配你的单元格时,你给它一个标识符,这个标识符用于检索用该字符串标记的单元格。

答案 4 :(得分:0)

您可以使用此

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath

iOS 6之后可以使用

或者您也可以在ViewDidLoad中的某个地方注册您的类并使用ResuseIdentifier,因此您不必在CellForRowAtIndexpath中编写ResuseIdentifier部分

- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0)

希望这可以帮助你...