推送tableview结果在cellForRowAtIndexPath异常中

时间:2012-09-27 14:15:17

标签: objective-c xcode

我正在尝试构建一个多层xmlparser,它在tableview中显示数据,并根据所选行切换到下一个视图(最有可能是同一个viewcontroller)。

我从故事板segues开始,但由于我使用动态单元格,我不知道如何创建多个push segue(因为它需要推送到各种viewcontrollers)。所以我保留了故事板视图,删除了所有的segues并使用了下面的代码。

然而,当新视图试图对行进行合并时,它会抛出此异常:

  

由于未捕获的异常而终止应用   'NSInternalInconsistencyException',原因:'UITableView dataSource   必须从tableView:cellForRowAtIndexPath:'

返回一个单元格
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"index: %i", indexPath.row);

    switch (indexPath.row) {
        case 0:
        {
            DetailViewController *detailViewController = [DetailViewController alloc];
            [self.navigationController pushViewController:detailViewController animated:YES];
            break;
        }
        //...
        default:
        {
            LayerViewController *layerViewController= [LayerViewController alloc];
            [layerViewController setStartUpWithIndex:indexPath.row andLayer:layercount];
            [self.navigationController pushViewController:layerViewController animated:YES];
            break;
        }


    }

}

setStartUpWithIndex:andLayer:是我的init方法......

使用以下segue代码通过storyboard segue推送时不会出现问题:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        [[segue destinationViewController] setStartUpWithIndex:indexPath.row andLayer:layercount];
}

我想我错过了一些“segue”方法,我需要将其包含在didSelectRowAtIndexPath中作为cellForRowAtIndexPath:在视图的第一层中正常工作。

请求编辑:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"LayerCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell.textLabel.text = [[articles objectAtIndex:indexPath.row]objectForKey:@"HerstellerName"];
//    cell.textLabel.text = @"ololol";

    return cell;
}

文章数组正在运行btw

2 个答案:

答案 0 :(得分:1)

您没有创建任何单元格。我不知道为什么Apple没有在默认实现中包含它,但在:

之后
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

您需要添加:

if (cell==nil){
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

否则,您只是依赖于在加载tableView时不存在的出列单元格。

编辑:如果您不使用ARC,则需要使用自动释放包装该alloc方法。

答案 1 :(得分:0)

您正在推送另一个viewController进行查看,下一个viewController没有实现dataSource方法。发生了什么。

据我所知,您试图以每个表行包含呈现节点的子节点的方式呈现带有表的xml节点。选择具有chld节点的行可以转到下一个表视图,该表显示具有所选节点的子节点的表。

IMO您可能只需要一个视图控制器来呈现当前的xml节点,该节点仅更改要在表中显示的数据并再次重新加载表。因此不需要推动视图控制器。您可以使用then方法

– reloadRowsAtIndexPaths:withRowAnimation:

对于表中的所有节点,设置类似于更改视图控制器的动画(也就是左侧滑动旧表)