在UITableViewController中处理行删除

时间:2010-05-06 14:58:39

标签: iphone core-data uitableview

我有一个UINavigationController。第一级是UITableViewController,第二级只显示表视图的其中一项的详细信息。

在此详细视图中,我可以删除该项目。它删除基础托管对象。

当我回到视图时,我发生了崩溃。我理解为什么,这是因为我没有更新包含数据的缓存数组。

我查看了几个教程,但我并不完全理解我应该如何处理删除。也许我不明白我应该在哪里获取模型中的对象。我应该对每个cellForRowAtIndexPath执行查询,并在位置indexPath.row中获取结果中的项吗?它看起来效率不高。我应该检查某处的更改并在数组中重新缓存整个查询。我认为CoreData会提供更自然的东西,但到目前为止我找不到它。

提前致谢。

3 个答案:

答案 0 :(得分:2)

这很简单。在子视图中,您应该(确实应该)引用您正在使用的NSManagedObject。当你想删除它时,你只需:

NSManagedObjectContext *moc = [[self myObject] managedObjectContext];
[moc deleteObject:[self myObject]];
NSError *error = nil;
if (![moc save:&error]) {
  NSLog(@"Save failed: %@\n%@", [error localizedDescription], [error userInfo]);
}

这将删除该对象。父母,因为它正在使用NSFetchedResultsController(你也应该真的这样做)将会照顾好自己。

答案 1 :(得分:1)

从您的详细控制器中删除父控制器中的项目似乎有些不合标准,但在您的情况下可能有意义。我猜你知道你可以直接删除tableview中的项目。 Apple有许多示例代码项目,以及文档应该让您知道如何做到这一点。

要回答您的问题,您可以在详细控制器的类中创建一个属性/变量,该类包含对tableview控制器的引用,然后向该控制器发送消息以处理删除。为此创建协议将是一种好的风格,但不是必需的。当tableview类收到删除项消息时,它会更新数组,当重新显示该视图时,您应该在tableview上调用reloadData。这是标准范例:对基础数据模型进行更改并告诉tablview重新加载。

答案 2 :(得分:1)

如果您不使用NSFetchedResultsController,您需要做的就是实施以下方法:

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

if (editingStyle == UITableViewCellEditingStyleDelete) {
    // Delete the managed object at the given index path.
    NSManagedObject *rowToDelete = [currentRows objectAtIndex:indexPath.row];
    [managedObjectContext deleteObject:rowToDelete];

    // Commit the change.
    NSError *error;
    if (![managedObjectContext save:&error]) {
        // Handle the error.
        NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
        NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
        if(detailedErrors != nil && [detailedErrors count] > 0) {
            for(NSError* detailedError in detailedErrors) {
                NSLog(@"  DetailedError: %@", [detailedError userInfo]);
            }
        }
        else {
            NSLog(@"  %@", [error userInfo]);
        }
    }

    // Update the array and table view.
    [currentRows removeObjectAtIndex:indexPath.row];
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
}

if (editingStyle == UITableViewCellEditingStyleDelete) { // Delete the managed object at the given index path. NSManagedObject *rowToDelete = [currentRows objectAtIndex:indexPath.row]; [managedObjectContext deleteObject:rowToDelete]; // Commit the change. NSError *error; if (![managedObjectContext save:&error]) { // Handle the error. NSLog(@"Failed to save to data store: %@", [error localizedDescription]); NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey]; if(detailedErrors != nil && [detailedErrors count] > 0) { for(NSError* detailedError in detailedErrors) { NSLog(@" DetailedError: %@", [detailedError userInfo]); } } else { NSLog(@" %@", [error userInfo]); } } // Update the array and table view. [currentRows removeObjectAtIndex:indexPath.row]; [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES]; }

} 是您在表格中显示的对象的NSArray。

干杯