使用fetchedResultsController分组UITableView

时间:2013-08-19 07:47:05

标签: ios objective-c uitableview nsfetchedresultscontroller

我有一个分组tableView有1个部分,单元格的内容由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可以很好地检索数据,并且它不是空的,所以这里有什么问题?

1 个答案:

答案 0 :(得分: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];
    }
}

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

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

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

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

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

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