2

我有一个包含 1 个部分的分组tableView,单元格的内容由fetchedResultsController. 现在我需要稍微修改一下这个 tableview。我需要添加一个 UITableviewCell 和它自己的自定义内容(独立于fetchedResultsController),仅用于第一部分。第二部分必须与之前的版本相同tableView。因此,只需在所有现有内容之前的一个部分中添加一个单元格。相关方法:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
   // return [[self.fetchedResultsController sections]count];
    return 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (section == 0)
    {
        return 1;
    }
    else
    {
    id <NSFetchedResultsSectionInfo> secInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    return [secInfo numberOfObjects];
    }
}

但我在SIGABRT这里和-[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]'fetchedResultsController检索数据很好,而且它不是空的,那么这里有什么问题?

4

1 回答 1

2

原因是表视图中的第 1 节是获取结果控制器的第 0 节。所以你必须调整节号numberOfRowsInSection

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (section == 0) {
        return 1;
    } else {
         NSInteger frcSection = section - 1;
         id <NSFetchedResultsSectionInfo> secInfo = [[self.fetchedResultsController sections] objectAtIndex:frcSection];
         return [secInfo numberOfObjects];
    }
}

请注意,类似的调整是必要的

  • cellForRowAtIndexPath,
  • 在获取的结果控制器委托方法中

在 FRC 索引路径与其对应的表视图索引路径之间进行映射。

我会把你的第一个方法写成

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return  1 + [[self.fetchedResultsController sections] count];
}

这样即使 FRC 没有部分或超过 1 个部分,它也能正常工作。

于 2013-08-19T07:56:52.500 回答