1

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

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

但是,当新视图尝试填充该行时,它会引发此异常:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“UITableView 数据源必须从 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: 是我的初始化方法...

当我使用以下 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;
}

顺便说一句,文章数组正在工作

4

2 回答 2

1

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

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

您需要添加:

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

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

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

于 2012-09-27T15:59:57.020 回答
0

您正在推动另一个 viewController 被查看,而下一个 viewController 没有实现 dataSource 方法。这是发生了什么。

据我了解,您正在尝试以每个表行包含呈现节点的子节点的方式呈现一个带有表的 xml 节点。选择带有 chld 节点的行会让您进入下一个表视图,该视图显示带有所选节点的子节点的表。

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

– reloadRowsAtIndexPaths:withRowAnimation:

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

于 2012-09-27T15:33:49.213 回答