5

假设我有

- (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];
}

那是要做什么?

如果单元格不是零,假设您在第 5 行,它会返回第 5 行的单元格,并带有确切的文本标签等吗?

基本上,我的问题是,如果您有带有标签、图像视图等的自定义单元格,您如何使用cellForRowAtIndexPathwith dequeueReusableCellWithIdentifier

4

5 回答 5

3

您尝试使单元格出列。如果尝试失败(单元格为零),则创建一个单元格并将其配置为视图(而不是视图内的数据)。之后,您可以使用更改单元格到单元格的任何数据或设置填充视图。此外,您应该将任何自定义视图添加到单元格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 中创建它,这样您就可以拥有引用标签、按钮等的自定义属性。

于 2013-07-16T21:50:56.313 回答
0

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

于 2013-07-16T21:58:54.370 回答
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)

希望这可以帮助你...

于 2013-07-31T06:28:18.757 回答
0

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

创建一个 UITableViewCell 子类,我们称它为 MyTableViewCell,它具有保存它需要的标签/图像视图/等的属性。一旦您对 MyTableViewCell 之一进行了出列或分配初始化,您就可以在这些属性上设置文本/图像/等。像这样:

- (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 委托只需要担心用数据填充这些视图。

于 2013-07-16T21:49:17.607 回答
0

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

于 2013-07-16T22:01:17.097 回答