Ios 使用NSFetchedResultsController时出现奇怪的删除行为

Ios 使用NSFetchedResultsController时出现奇怪的删除行为,ios,uitableview,core-data,ios7,nsfetchedresultscontroller,Ios,Uitableview,Core Data,Ios7,Nsfetchedresultscontroller,我正在使用此代码删除我的NSFetchedResultsController中的一行。除删除符号外,行删除的动画工作正常。该标志保持完全可见,直到该行褪色,然后突然消失。但一切都应该淡出,包括删除标志,就像在其他应用程序中一样。我又错过了什么 以下是所有相关的方法(所有方法都被正确调用,我尝试了不同的动画类型,但都不起作用) 10次尝试后,确定制作了一个屏幕截图:-) 编辑:在这里您可以看到问题:删除操作发生,待删除行逐渐消失,而删除符号保持完全可见且不消失。只有在该行完全消失后,删除符号才会

我正在使用此代码删除我的
NSFetchedResultsController
中的一行。除删除符号外,行删除的动画工作正常。该标志保持完全可见,直到该行褪色,然后突然消失。但一切都应该淡出,包括删除标志,就像在其他应用程序中一样。我又错过了什么

以下是所有相关的方法(所有方法都被正确调用,我尝试了不同的动画类型,但都不起作用)

10次尝试后,确定制作了一个屏幕截图:-)

编辑:在这里您可以看到问题:删除操作发生,待删除行逐渐消失,而删除符号保持完全可见且不消失。只有在该行完全消失后,删除符号才会立即消失

编辑2:
我已经缩小了范围。如果我用所有位置的新计算对这个循环进行注释,那么delete的效果和预期的一样好。但我需要更新这些职位,不是吗?或者您将如何做到这一点?

我将尝试重新计算
-(void)controllerDidChangeContent:(NSFetchedResultsController*)controller
方法中的位置。只是为了确保一切都完成了。否则我就不知道去哪里做了。也许有一个合适的通知来监听上下文中的更改,但我不知道

显然,

但我需要更新这些职位,不是吗

这取决于你的需要。如果你不这样做,没有人会更新它们。但是如果使用
position
属性对项目进行排序,则需要重新计算每个提取的元素

所以


重新计算位置会更新提取的对象,这会对表触发更多更新,从而干扰动画


如果您需要position属性来支持手动排序,那么当您重新计算它时,应该禁止通过FRC进行更新。看起来您已经有了一些允许这样做的状态,所以应该相当简单

这种奇怪行为的截图可能很有用……为什么要复制抓取的对象?有什么原因吗?我的表中有一个属性位置(根据用户选择的排序,该特定类别在当前表中的位置)。因此,如果一个类别被删除,所有其他位置都需要更新。正在尝试制作屏幕快照,但为什么要复制已获取的对象?我想没有必要…但是for循环是必要的,不是吗?所以我应该只为(maincography*fetchedResults在[self.fetchedResultsController fetchedObjects]中的fetchedResult)编写代码,不幸的是没有工作。但我已经考虑过了。因为我只在分类时使用这个位置,所以我看不出保持它完全准确有什么用。当然,在重新排序之后,我必须更新它。但删除后不会。如果缺少一个数字,应该不会有问题,因为排序仍然有效。是的,尝试过,但是删除根本没有发生。我想我只是接受一些缺失的数字,这些数字将在重新排序后再次填充。因此,如果有人不见了,我很高兴,这类人不会受到影响。:-)
- (void)tableView:(UITableView *)aTableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Update the data model according to edit actions delete or insert.
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [self.managedObjectContext deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

        //Adjust the indices of the remaining entries
        NSArray *fetchedResults = [[self.fetchedResultsController fetchedObjects] copy];

        int i = 1;
        for (MainCategory *fetchedResult in fetchedResults)
        {
            fetchedResult.position = [NSNumber numberWithInt:i++];
        }
    }
}

- (void)controller:(NSFetchedResultsController *)controller
   didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath
     forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath
{
    if(!self.reordering){
        if (!self.suspendAutomaticTrackingOfChangesInManagedObjectContext)
        {
            switch(type)
            {
                case NSFetchedResultsChangeInsert:
                    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
                    break;

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

                case NSFetchedResultsChangeUpdate:
                    [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
                    break;

                case NSFetchedResultsChangeMove:
                    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
                    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
                    break;
            }
        }
    }
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView endUpdates];

    if(self.recalculatePosition) { // this means that somewhere you set that bool to YES

        // suspend the tracking of changes before???

        self.recalculatePosition = NO; 

        // for loop here...
    }
}