分组的tableview - 新条目需要新的部分。使用核心数据

时间:2014-09-14 01:23:54

标签: ios objective-c uitableview core-data

在我的应用程序中,我有一个从核心数据加载的分组tableview。我使用获取结果中的短日期来创建部分。用户可以通过从模态视图中选择要添加的内容来添加事件。

所以它可能有一个这样的列表(其中日期是章节标题):

09-01-2014
  John D.
  Bob S.
  Tim S.
08-27-2014
  Bill B.
  John D.
08-19-2014
  Jane D.
  Tim S.
...  

在这种情况下,日期是添加此人的日期。就像登录日期......

我通过模拟方式在数据库中呈现一组人员并使用协议方法将所选人员传回我的视图控制器来处理选择的人员:

-(void)ViewController:(UIViewController *)sender didSelectPlayer:(Player *)selectedPlayer 
{
  CheckIn *newCheckIn = [NSEntityDescription insertNewObjectForEntityForName:@"CheckIn"
                                                    inManagedObjectContext:[self managedObjectContext]];

  newCheckIn.checkedInPlayer = selectedPlayer;
  newCheckIn.checkInTime = [NSDate date];
  newCheckIn.player = [UtilityMethods nameForLabelsWithFirstName:selectedPlayer.firstName withLastName:selectedPlayer.lastName];
  newCheckIn.checkedInPlayer.timeOfLastCheckIn = newCheckIn.checkInTime;
  [newCheckIn.checkedInPlayer setIsCheckedIn:[NSNumber numberWithBool:YES]];
  [newCheckIn setSortDate:[UtilityMethods shortDatefromDate:newCheckIn.checkInTime]];

  [super Save];
}

没什么特别的,只需设置我添加的记录的属性。

请注意,我的实体具有以下属性:checkInTime和sortDate。 sortDate只是checkInTime的一个短日期。它是用于构建节的属性,但是......

在我的fetchedResultsController中:

...
    _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchedRequest
                                                                managedObjectContext:context
                                                                  sectionNameKeyPath:@"sortDate"
                                                                           cacheName:nil];
...

问题: 在任何一天,输入的任何记录都不会显示在tableview中,除非我关闭tableview然后重新加载它。我在调试器中收到此错误:

  

在调用-controllerDidChangeContent时,从NSFetchedResultsController的委托中捕获到异常:。
  无效更新:无效的节数。更新后的表视图中包含的节数(3)必须等于更新前的表视图中包含的节数(2),加上或减去插入或删除的节数(插入0,0删除)。 with userInfo(null)

如果删除任何部分中的最后一项,也会发生同样的事情。

我很难理解如何在需要时让视图处理部分的添加或删除。

提前致谢...

1 个答案:

答案 0 :(得分:1)

找到它......需要实现这个方法:

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
       atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {

switch(type) {
    case NSFetchedResultsChangeInsert:
        [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex]
                      withRowAnimation:UITableViewRowAnimationFade];
        break;

    case NSFetchedResultsChangeDelete:
        [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex]
                      withRowAnimation:UITableViewRowAnimationFade];
        break;
}
}