1

我正在显示来自CoreData用作容器的UITableView数据。删除一行的代码运行良好,但我的实现让我觉得不够优雅。有没有更好的办法?NSFetchedResultsControllerNSManagedObjects

下面的代码说明了删除事件:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

{
    if (editingStyle == UITableViewCellEditingStyleDelete) {

        // Delete the row from the data source 
       [myContext deleteObject:[fetchedResultsController objectAtIndexPath:indexPath]];

        if (![myContext save:&error]) { 
            // Error handling
        }  

        fetchedResultsController = nil;

        if (![[self getFetchedResultController] performFetch:&error]) {
             // Error handling
        }
        [tableView reloadData];        
    }   
}

我设置fetchedResultsControllernil并执行另一次获取以更新新内容。

我担心的是,我在各种论坛上看到了暗示上下文的变化应该自动引起 fetchedResultsController 变化的参考资料,也许第二次获取是不必要的。在这一点上,我还没有实现部分。

另一个问题是代码只是让行消失而没有任何动画。

可以引入一些流畅的动画吗?

4

1 回答 1

2

研究使用NSFetchedResultsControllerDelegate 协议方法来管理对表和数据库的更改。这样,每当您在 NSFetchedResultsController 的 NSManagedObjectContext 中进行保存时,托管的 o​​jbect 上下文都会通知 fetchedResultsController。然后 fetchedResultsCotnroller 将调用它的委托方法。

您想要实现 controllerWillChangeContent: 和 controllerDidChangeContent: 以便您可以将其他委托方法的调用与对表视图的 beginUpdates 和 endUpdates 方法的调用括起来。(参见参考资料中的示例。)这可以防止表视图与 fetchedResultsController 不同步。

然后删除这些行:

 fetchedResultsController = nil;

        if (![[self getFetchedResultController] performFetch:&error]) {
             // Error handling
        }
        [tableView reloadData];     

完成此操作后,您可以在单元格的插入和删除中引入动画。

于 2012-01-11T22:06:35.447 回答