多个NSFetchedResultsController - didChangeObject

时间:2011-10-24 18:45:33

标签: core-data nsfetchedresultscontroller

我有UITableView使用2 NSFetchedResultsControllers。每个NSFetchedResultsController只有一个部分。但是,该表有4个部分。我使用NSFetchedResultsControllers之一的结果填充表格的第4部分。到目前为止一切正常。但是,如果用户删除第一部分中的第一个单元格,则会更改NSFetchedResultsControllers。表的最后一部分中的行可能会被删除。调用此方法时:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
   atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
  newIndexPath:(NSIndexPath *)newIndexPath
{
UITableView *tableView = self.tableView;

switch(type) {
    case NSFetchedResultsChangeInsert:
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;

    case NSFetchedResultsChangeDelete:
        NSLog(@"section: %d, row: %d", [newIndexPath section], [newIndexPath row]);

        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;
...
}

该部分始终为0,因为它是NSFetchedResultsControllers的部分。因此,该部分与表视图中的正确部分不匹配。

有解决方法吗?我基本上想将NSFetchedResultsController的部分更改为3而不是0。

1 个答案:

答案 0 :(得分:2)

我找到了一种解决方法,但是有一个更漂亮的解决方案会很好。

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
   atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
  newIndexPath:(NSIndexPath *)newIndexPath
{
UITableView *tableView = self.tableView;
if (newIndexPath != nil && controller == self.fetchedXController) {
    newIndexPath = [NSIndexPath indexPathForRow:[newIndexPath row] inSection:3];
    if ([tableView cellForRowAtIndexPath:newIndexPath] == nil) {
        type = NSFetchedResultsChangeInsert;
    }
}
if (indexPath != nil && controller == self.fetchedDomainsController) {
    indexPath = [NSIndexPath indexPathForRow:[indexPath row] inSection:3];
}

switch(type) {
    case NSFetchedResultsChangeInsert:
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;

    case NSFetchedResultsChangeDelete:
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;

    case NSFetchedResultsChangeUpdate:
        [self configureCell:[tableView cellForRowAtIndexPath:newIndexPath] atIndexPath:newIndexPath];
        break;
...