NSFetchedResultsControllers

NSFetchedResultsControllers

我有一个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的部分。因此,该部分与表格 View 中的正确部分不匹配。

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

最佳答案

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

- (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;
...

关于core-data - 多个NSFetchedResultsController-didChangeObject,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7880294/

10-10 21:14