如何删除对象时,如何让我的表视图显示数据?

时间:2010-09-24 21:04:52

标签: iphone uitableview core-data

我有一个表视图,它位于一个继承自UITableViewController的视图控制器中。

我使用NSFetchedResultsController来获取核心数据存储中的表数据。我已经尝试过打开和关闭缓存。

我将NSFetchedResultsController的委托设置为self,我在视图控制器中实现了controllerDidChangeContent。

我总是实现表视图委托函数,包括在用户删除行时调用的commitEditingStyle。

以下是发生的事情。用户滑动并删除一行,并按预期调用commitEditingStyle。在该函数中,我修改了我的核心数据对象,以便从结果中有效地删除它们。换句话说,如果您运行查询我再次传递了NSFetchedResultsController,那么该行现在将不再出现在结果集中。

仅此一点是不够的,所以我在commitEditingStyle的末尾添加了一个名为tableView的reloadData。仍然没有运气,所以我添加了一个调用reloadData的刷新按钮,这也无济于事。转到另一个视图控制器(通过点击“返回”)并返回到页面通常不起作用,但最终它会计算出来并且行将正确消失。当然,从头开始重新运行程序总能正常工作,但是如何才能让我的tableView正确更新? controllerDidChangeContent永远不会被调用。我认为reloadData就足够了,但似乎不是。

1 个答案:

答案 0 :(得分:0)

您是否实现了Fetched结果控制器的控制器didChangeObject:委托方法?

最简单的方法是使用基于导航的模板创建一个新项目,其中包含核心数据,并将RootViewController与您的代码进行比较。 RootViewController已经包含在tableview修改后执行更新的代码。

这是这样的:

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

if (editingStyle == UITableViewCellEditingStyleDelete) {
    // Delete the managed object for the given index path
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

    // Save the context.
    NSError *error = nil;
    if (![context save:&error]) {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}

}

然后使用此方法更新表视图

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

UITableView *tableView = self.tableView;

switch(type) {

    case NSFetchedResultsChangeInsert:
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;

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

    case NSFetchedResultsChangeUpdate:
        [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
        break;

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