使用2个相同的NSIndexPath调用NSFetchedResultsChangeMove时如何保持单元格的选择?

时间:2016-05-25 14:22:42

标签: ios uitableview nsfetchedresultscontroller

如果我点击一个单元格并进行后台核心数据刷新,我的单元格将被取消选择。

经过调查后,我NSFetchedResultsControllerDelegate controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:的{​​{1}}实施方式被调用NSFetchedResultsChangeMoveindexPathnewIndexPath相同(即相同的行/节值)。

NSFetchedResultsChangeUpdate类型无法调用。

controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:的实施是Apple的文档中提供的典型实现。我相信转自:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath {

    ...

    switch(type) {

        ...

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}

为:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath {

    ...

    switch(type) {

        ...

        case NSFetchedResultsChangeMove:
            if (indexPath.section != newIndexPath.section || indexPath.row != newIndexPath.row) {
                [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
                [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            }
            break;
    }
}

会解决我的问题。

我的问题是:此修复程序是正确的还是我错过了可以解释为什么我的更新属于NSFetchedResultsChangeMove类型的内容?

1 个答案:

答案 0 :(得分:0)

我的问题是,我正在为NSManagedObject个实例分配值,这些实例与以前相同。即,如果foo.bar为2,我会调用API并在我的对象上调用新的foo.bar = 2赋值。即使价值相同,Core Data仍在考虑价值已发生变化。

我得到NSFetchedResultsChangeMove类型而不是NSFetchedResultsChangeUpdate类型仍然很奇怪,但是嘿。

我采取的措施是:

if ([object.changedValues count] == 0) {
    // Reverting changed on object
    [context refreshObject:object mergeChanges:NO]
}

在每次更新结束时,而不是逐个比较属性。