带有多个自定义单元格的“UITableView 无法从其数据源获取单元格”

Posted

技术标签:

【中文标题】带有多个自定义单元格的“UITableView 无法从其数据源获取单元格”【英文标题】:"UITableView failed to obtain a cell from its dataSource" with Multiple Custom cells 【发布时间】:2019-04-15 18:24:24 【问题描述】:

我有一个 NSArray(称为 masterArray),其中包含 2 种不同类型的对象 - object1 和 object2。这些对象需要 2 个不同的表格视图单元格(每个都是以编程方式制作的),我是这样实现的


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

    if ([[masterArray objectAtIndex:indexPath.row] isKindOfClass:[object1 class]])
    
        cell1 *cell = (cell1 *)[tableView dequeueReusableCellWithIdentifier:@"obj1Cell"];
        if (cell == nil)
        
            cell = [[cell1 alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"obj1Cell"];
        
        //set up labels and stuff
        return cell;
    

    if ([[masterArray objectAtIndex:indexPath.row] isKindOfClass:[object2 class]])
    
        cell2 *cell = (cell2 *)[tableView dequeueReusableCellWithIdentifier:@"obj2Cell"];
        if (cell == nil)
        
            cell = [[cell2 alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"obj2Cell"];
        
        //set up labels and stuff
        return cell;
    
    return nil;


现在,这段代码可以很好地显示单元格。当您点击一个单元格时,我使用此代码:


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    newViewController *newVC = [[newViewController alloc]init];
    newVC.item = [masterArray objectAtIndex:indexPath.row];
    [self.navigationController pushViewController:newVC animated:YES];

但是,当我点击时,我收到错误消息“UITableView 无法从其数据源获取单元格”。我也看过其他回答这个问题的问题。 This one 表示要添加行

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

所以我这样做了,用

替换我的“cell1 *cell = (cell1 *)...”行
cell1 *cell = (cell1 *)[tableView dequeueReusableCellWithIdentifier:@"obj1Cell" forIndexPath:indexPath];

现在我得到了一个

"'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier obj1cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard"

错误,这不适用于我的情况,因为我的 UITableViewCells 是以编程方式制作的(没有情节提要)。在那篇文章中还建议添加“UITableViewDelegate,UITableViewDataSource”,但这似乎只是 Swift 中的一个选项,而不是 Objective-C。

【问题讨论】:

【参考方案1】:

在使用带有 ID 的 dequeueReusableCellWithIdentifier 之前,您需要像这样注册此 ID:

- (void)viewDidLoad 
    [super viewDidLoad];

    self.tableView = ...;
    [self.tableView registerClass:[cell1 class] forCellReuseIdentifier:@"obj1Cell"];
    [self.tableView registerClass:[cell2 class] forCellReuseIdentifier:@"obj2Cell"];

补充说明:

if (cell == nil) 是多余的,因为它在实践中永远不会为零。 在 Objective-C 中,约定是类名以应用前缀(2-3 个大写字母)和一个大写字母开头,例如:MYCell1、MYCell2、MYObject1 等(将 MY 替换为对您有意义的内容)。

【讨论】:

我添加了这些行,但我仍然遇到同样的错误......不过,感谢您提供有关 (cell == nil) 行的提示。我从来没有这样想过。 你确定数组中的所有对象都是object1类还是object2类?

以上是关于带有多个自定义单元格的“UITableView 无法从其数据源获取单元格”的主要内容,如果未能解决你的问题,请参考以下文章

使用 Auto Layout 创建具有多个不同自定义单元格的 UITableView 具有几乎相同的子视图

带有自定义单元格的 UITableView

带有包含自定义单元格的 UITableView 的 UISearchBar => 空白单元格

带有自定义单元格的 UITableView 弹出窗口失败,单元格属性始终为零

带有单个自定义单元格的 UITableView? (苹果手机)

带有自定义单元格的 ViewController 内的 UITableView 没有情节提要