在tableViewController中使用多个单元类

时间:2010-08-31 04:28:36

标签: iphone uitableview

有没有办法在tableViewController中使用多个uitableviewcell类和nib文件?

有一个很棒的教程视频,关于如何在cellForRowAtIndexPath函数中创建要在tableViewController中使用的自定义单元类,我会粘贴here,以防有人想看。

在这个例子中,他们只使用一种可重用的单元类。这来自我自己的项目,但它基本上是教程提供的内容。 “videoCellEntry”是我用nib文件videoEntryCell.xib创建的自定义单元格,“videoEntry”是我正在配置的每个单元格的类,“videos”是videoEntry的数组。

我假设使用多个nib文件,我可以设置一些条件来选择我想要的nib文件,然后调用另一个loadNibNamed:部分如下:

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

    static NSString *CellIdentifier = @"videoCellId";

    videoEntryCell *cell = 
  (videoEntryCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        if(<condition 1>) {
          NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"videoEntryCell" owner:self options:nil];
        }
        if(<condition 2>) {
                NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"videoEntryCell2" owner:self options:nil];
        }
 cell = (videoEntryCell *)[nib objectAtIndex:0];
    }

 // Configure the cell.
 videoEntry *vid = [videos objectAtIndex:indexPath.row];
 [cell configureForVideoEntry:vid];

    return cell;
}

但是tableViewController可以处理多个单元格的nib文件吗?或者,还有更好的方法?并且每个单元格不会根据其nib文件需要不同的CellIdentifier吗?

1 个答案:

答案 0 :(得分:1)

是的,您可以在TableViewController中使用多个Nib-Files和多个CellIdentifier。只需将您的条件放在CellIdentifier之前。这就是我做的方式。

- (UITableViewCell *)tableView中的一些示例:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法:

首先定义变量单元格:

UITableViewCell *cell;

现在是if-Block:

if(<condition 1>) {
    static NSString *CellIdentifier = @"VideoCell1";
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"videoEntryCell" owner:nil options:nil];
        for (id currentObject in topLevelObjects){
            if([currentObject isKindOfClass:[UITableViewCell class]]){
                cell = (UITableViewCell *) currentObject;
                break;
            }
        }
    }
    // customize your cell here
}

if(<condition 2>) {
    static NSString *CellIdentifier = @"VideoCell2";
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"videoEntryCell2" owner:nil options:nil];
        for (id currentObject in topLevelObjects){
            if([currentObject isKindOfClass:[UITableViewCell class]]){
                cell = (UITableViewCell *) currentObject;
                break;
            }
        }
    }
    // customize your cell here
}

最后:

return cell;

您可以根据需要随时重复if-Block。返回一个 nil。

的单元格非常重要