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

时间:2014-01-01 15:40:42

标签: ios uitableview core-data ios7 nsfetchedresultscontroller

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

以下是所有相关方法(并且所有方法都被正确调用,我尝试过不同的动画类型,但也没有用。)

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

好好经过10次尝试设法制作截图:-) enter image description here

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

编辑2:  我把它缩小了。如果我使用所有位置的新计算来评论此循环,则删除的效果与预期的一样。但是我需要更新这些职位吗?或者你会怎么做?

2 个答案:

答案 0 :(得分:1)

我会尝试重新计算- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller方法中的位置。只是为了确保一切都完成了。否则我不知道该怎么做。也许有适当的通知来听取上下文中的变化,但我不知道。

显然,

  

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

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

所以,

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

答案 1 :(得分:1)

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

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