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

时间:2019-04-15 18:24:25

标签: objective-c uitableview

我有一个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无法从其dataSource获取单元格”。我也查看了其他问题来回答这个问题。 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 个答案:

答案 0 :(得分:1)

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

@Override
protected void onResume() {
    super.onResume();

    DisplayManager manager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
    Display[] displays = manager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);

    if (displays.length > 0) {
        Presentation presentation = new MyPresentation(this, displays[0]);
        presentation.show();
    }
}

其他说明:

  • - (void)viewDidLoad { [super viewDidLoad]; self.tableView = ...; [self.tableView registerClass:[cell1 class] forCellReuseIdentifier:@"obj1Cell"]; [self.tableView registerClass:[cell2 class] forCellReuseIdentifier:@"obj2Cell"]; } 是多余的,因为在实践中它永远不会为零。
  • 在Objective-C中,惯例是使用应用程序前缀(2-3个大写字母)和一个大写字母(例如:MYCell1,MYCell2,MYObject1等)开头的类名。(用对您有意义的东西替换MY )。