我使用CoreData
作为UITableView
的容器,在NSFetchedResultsController
中显示来自NSManagedObjects
的数据。删除行的代码运行良好,但我的实现让我觉得不那么优雅。还有更好的方法吗?
下面的代码说明了删除事件:
- (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];
}
}
我将fetchedResultsController
设置为nil
并执行另一次提取以更新新内容。
我担心的是,我在各种论坛上看到过引用,暗示上下文中的更改应该自动生成fetchedResultsController中的更改,并且可能不需要第二次获取。我此时尚未实施部分。
另一个问题是代码只是让行消失而没有任何动画。
可以引入一些光滑的动画吗?
答案 0 :(得分:2)
使用NSFetchedResultsControllerDelegate Protocol methods来管理对表和数据库的更改。这样,只要在NSFetchedResultsController的NSManagedObjectContext中进行保存,就会通过托管的ojbect上下文通知fetchedResultsController。然后fetchedResultsCotnroller将调用其委托方法。
您希望实现controllerWillChangeContent:和controllerDidChangeContent:因此您可以通过调用表视图的beginUpdates和endUpdates方法来包含其他委托方法的调用。 (请参阅参考中的示例。)这可以防止表视图与fetchedResultsController失去同步。
然后删除这些行:
fetchedResultsController = nil;
if (![[self getFetchedResultController] performFetch:&error]) {
// Error handling
}
[tableView reloadData];
完成此操作后,您可以在插入和删除单元格中引入动画。