在UITableView中为每个部分使用不同的自定义单元格

时间:2015-11-17 04:27:41

标签: ios objective-c uitableview

我发现桌子上发生了一些奇怪的事。我想创建包含两个或更多部分的表,在第一部分我想使用与其他部分不同的自定义单元格。

所以我在tableView:cellForRowAtIndexPath

上创建了这个
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"cell";
    if (indexPath.section == 0) {
        // cell for section one
        HeaderCell *headerCell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if(!headerCell) {
            [tableView registerNib:[UINib nibWithNibName:@"HeaderCell" bundle:nil] forCellReuseIdentifier:cellIdentifier];
            headerCell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        }
        headerCell.labelName.text = @"First Section";
        return headerCell;
    }
    else {
        // Cell for another section
        DetailCell *detailCell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if (!detailSection) {
            [tableView registerNib:[UINib nibWithNibName:@"DetailCell" bundle:nil] forCellReuseIdentifier:cellIdentifier];
            detailCell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        }
        detailCell.textLabel.text = @"Another Section Row";
        return detailCell;
    }
}

在第一部分中,我想对我的行使用headerCell,然后在其他部分使用detailCell。此代码有效,但在第二部分的行看起来仍然在headerCell下使用detailCell“。我在headerCell.xib添加了标签,它仍显示在detailCell上。见image

我认为这一切都是因为我为所有部分使用了一个单元格标识符。谁有解决方案?非常感谢你。

1 个答案:

答案 0 :(得分:9)

每种类型的自定义单元格都应该有自己唯一的标识符。您的代码尝试对所有单元使用相同的单元标识符。那不会起作用。

另外,在viewDidLoad中注册两种单元格类型,而不是cellForRowAtIndexPath:

试试这个:

static NSString *cellIdentifier0 = @"cell0";
static NSString *cellIdentifier1 = @"cell1";

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0) {
        // cell for section one
        HeaderCell *headerCell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier0 forIndexPath:indexPath];

        headerCell.labelName.text = @"First Section";

        return headerCell;
    } else {
        // Cell for another section
        DetailCell *detailCell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier1 forIndexPath:indexPath];

        detailCell.textLabel.text = @"Another Section Row";

        return detailCell;
    }
}

- (void)viewDidLoad {
    [super viewDidLoad];

    // the rest of your code

    [self.tableView registerNib:[UINib nibWithNibName:@"HeaderCell" bundle:nil] forCellReuseIdentifier:cellIdentifier0];
    [self.tableView registerNib:[UINib nibWithNibName:@"DetailCell" bundle:nil] forCellReuseIdentifier:cellIdentifier1];
}