在cellForRowAtIndexPath中返回不同的UITableViewCell类型

时间:2010-12-09 00:26:59

标签: ios uitableview

我已根据有用的指导创建了一个自定义UITableViewCell从xib文件加载它; How do you load custom UITableViewCells from xib files

我只想在UITableView的第一行使用此自定义单元格,其他的是简单标签,标准UITableViewCell就可以了。

问题是当我包含自定义单元格时,整个UITableView未显示,除导航元素外,屏幕为空白。只使用标准单元格,表格显示正常,因此它与自定义单元格有关。

以下是我必须返回单元格的代码;

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

    if(indexPath.row == 0)  {
        ArticleDetailCell *cell = (ArticleDetailCell *)[tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"%@Detail", reuseIdentifier]];

        if(!cell) {
            // Load the top-level objects from the custom cell XIB.
            NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"ArticleDetailCell" owner:self options:nil];
            // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain).
            cell = (ArticleDetailCell *)[topLevelObjects objectAtIndex:0];
        }

        [[(ArticleDetailCell *)cell judges] setText:[[self caseBaseArticle] judges]];
        [[(ArticleDetailCell *)cell judgementDate] setText:[[self caseBaseArticle] judgmentDate]];
        [[(ArticleDetailCell *)cell court] setText:[[self caseBaseArticle] court]];

        return cell;

    } else {    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];

        if(!cell) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier] autorelease];
            [[cell textLabel] setNumberOfLines:1];
            [[cell textLabel] setFont:[UIFont systemFontOfSize:14]];
            [[cell textLabel] setText:articleRowTitles[indexPath.row-1]];
        }

        if ([self tableRowHasContentDetail:indexPath]) {
            [self enableTableCell:&cell];
        }else {
            [self disableTableCell:&cell];
        }       

        return cell;
    }
}

ArticleDetailCell是从xib文件加载的,并且属性设置正确,因为我可以在调试器中看到这一点。当我从return cell打印自定义单元格对象时停止在(gdb);

<ArticleDetailCell: 0x4bc22b0; baseClass = UITableViewCell; frame = (0 0; 320 367); autoresize = W+TM+BM; layer = <CALayer: 0x4bc23c0>>

细胞解除引用有问题吗?我仍然会考虑保留计数以及它们何时增加和不增加。

为什么整个UITableView因单个单元格出现问题而消失?

编辑: FYI @BoltClock

- (void)disableTableCell:(UITableViewCell **)cell {
    [*cell setAccessoryType:UITableViewCellAccessoryNone];
    [*cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    [[*cell textLabel] setTextColor:[UIColor lightGrayColor]];
}

2 个答案:

答案 0 :(得分:1)

reuseIdentifier 在哪里定义?它始终可用于此方法吗?

答案 1 :(得分:1)

问题主要在于自定义单元格的xib文件。严格遵循Apple开发人员中心的Loading Custom Cells from NIB Files就可以了。

关键是要将自定义单元格中的File's Owner设置为我使用单元格的UITableViewController类型。 UITableViewController还为自定义IBOutlet提供了UITableViewCell属性,该属性用于将File's Owner连接到xib文件中的自定义单元格。

重要的是,在表视图单元格的xib文件中设置了Identifer,以便它与dequeueReusableCellWithIdentifier方法中使用的值匹配。

cellForRowAtIndexPath就像这样articleDetailIBOutlet属性;

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

    if(indexPath.row == 0)  {
        ArticleDetailCell  *cell = (ArticleDetailCell *)[tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"%@Detail",reuseIdentifier]];

        if(!cell) {
            [[NSBundle mainBundle] loadNibNamed:@"ArticleDetailCell" owner:self options:nil];
            cell = articleDetail;
            [self setArticleDetail:nil];
        }

        [[cell judges] setText:[[self caseBaseArticle] judges]];
        [[cell judgementDate] setText:[[self caseBaseArticle] judgmentDate]];
        [[cell court] setText:[[self caseBaseArticle] court]];

        return cell;

    } else {    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];

        if(!cell) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier] autorelease];
            [[cell textLabel] setNumberOfLines:1];
            [[cell textLabel] setFont:[UIFont systemFontOfSize:14]];
            [[cell textLabel] setText:articleRowTitles[indexPath.row-1]];
        }

        if ([self tableRowHasContentDetail:indexPath]) {
            [self enableTableCell:&cell];
        }else {
            [self disableTableCell:&cell];
        }       

        return cell;
    }
}