加载多种类型的UITableViewCell

时间:2015-10-30 12:28:02

标签: ios objective-c uitableview

在我的表视图中,我尝试对大多数行使用默认表格视图单元格,但是想要为一行使用自定义单元格。问题是带有自定义单元格的一行。我显然没有正确加载它,因为我无法访问自定义单元格的属性。

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"UITableViewCell"];

    [self.tableView registerNib:[UINib nibWithNibName:@"KeepLoginCell" bundle:nil]
         forCellReuseIdentifier:@"KeepLoginCell"];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = nil;

    cell.backgroundColor = [UIColor clearColor];
    cell.textLabel.textColor = [UIColor whiteColor];

    if (indexPath.section == 0) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];

        if (!cell) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"];
        }

        if (indexPath.row == 0) {
            cell.textLabel.text = @"Recent Purchases";
        }
    } else if (indexPath.section == 1) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];

        if (!cell) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"];
        }

        if (indexPath.row == 0) {
            cell.textLabel.text = @"Payment Method";
        }
    } else if (indexPath.section == 2) {
        if (indexPath.row == 0) {
            cell = (KeepLoginCell *)[tableView dequeueReusableCellWithIdentifier:@"KeepLoginCell"];

            if (!cell) {
                cell = [[KeepLoginCell alloc]init];
            }
        } else if (indexPath.row == 1) {
            cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];

            if (!cell) {
                cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"];
            }

            cell.textLabel.text = [self.settingsArray objectAtIndex:indexPath.row];
        }
    }

    return cell;
}

3 个答案:

答案 0 :(得分:1)

在这一行:

cell = (KeepLoginCell *)[tableView dequeueReusableCellWithIdentifier:@"KeepLoginCell"];

即使您投射dequeue...消息以返回KeepLoginCell*,您的cell值仍会声明为通用UITableViewCell。因此,编译器/静态分析器/ xcode编辑器提示只显示与UITableViewCell相关的内容,而不是您的自定义子类。

请改用:

KeepLoginCell *klcell = (KeepLoginCell *)[tableView dequeue…
[klcell setCustomProperty:…];
cell = klcell;

答案 1 :(得分:1)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];    
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"];
    }

    cell.backgroundColor = [UIColor clearColor];
    cell.textLabel.textColor = [UIColor whiteColor];

    if (indexPath.section == 0) {                
        if (indexPath.row == 0) {
            cell.textLabel.text = @"Recent Purchases";
        } else { 
            //TODO: handle this case
        }
    } else if (indexPath.section == 1) {    
        if (indexPath.row == 0) {
            cell.textLabel.text = @"Payment Method";
        } else { 
            //TODO: handle this case
        }
    } else if (indexPath.section == 2) {
        if (indexPath.row == 0) {
            KeepLoginCell *customCell = (KeepLoginCell *)[tableView dequeueReusableCellWithIdentifier:@"KeepLoginCell"];

            if (!customCell) {
                customCell = [[KeepLoginCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"KeepLoginCell"];
            }
            //TODO: set values to your custom cell
            //e.g. customCell.myLabel.text = ...

            cell = customCell; 
        } else if (indexPath.row == 1) {
            cell.textLabel.text = [self.settingsArray objectAtIndex:indexPath.row];
        } else { 
            //TODO: handle this case
        }
    }

    return cell;
}

答案 2 :(得分:0)

问题是你没有任何类型KeepLoginCell的变量。因此,如果您确定自己的单元格是KeepLoginCell,则必须在每次调用时将其强制转换:

 [((KeepLoginCell*)cell) keepIt];

或者你可以把它放在这种类型的变量中

KeepLoginCell* keepLoginCell = (id)cell;
[keepLoginCell keepIt];