Iphone 处理UITableViewController中的行删除

Iphone 处理UITableViewController中的行删除,iphone,core-data,uitableview,Iphone,Core Data,Uitableview,我有一个导航控制器。第一个级别是UITableViewController,第二个级别仅显示表视图中某个项的详细信息 在此详细视图中,我可以删除该项。它删除基础托管对象 当我弹回到视图时,我有一个崩溃。我理解为什么,因为我没有更新包含数据的缓存数组 我看了几个教程,但我不太明白我应该如何处理删除。也许我不太清楚应该在模型中的什么位置获取对象。我是否应该对每个cellForRowAtIndexPath进行查询,并将结果中的项置于indexPath.row位置?看起来效率不高。我是否应该检查某个地方

我有一个导航控制器。第一个级别是UITableViewController,第二个级别仅显示表视图中某个项的详细信息

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

当我弹回到视图时,我有一个崩溃。我理解为什么,因为我没有更新包含数据的缓存数组

我看了几个教程,但我不太明白我应该如何处理删除。也许我不太清楚应该在模型中的什么位置获取对象。我是否应该对每个cellForRowAtIndexPath进行查询,并将结果中的项置于indexPath.row位置?看起来效率不高。我是否应该检查某个地方的更改并在数组中重新检查整个查询。我认为CoreData会提供一些更自然的东西,但我目前还没有找到


提前感谢。

从详细信息控制器中删除父控制器中的项目似乎有点不标准,但在您的情况下可能会有意义。我假定您知道可以直接删除tableview中的项。苹果公司提供了许多示例代码项目,这些项目和文档应该会让您了解如何做到这一点


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

从详细信息控制器中删除父控制器中的项目似乎有点不标准,但在您的情况下可能有意义。我假定您知道可以直接删除tableview中的项。苹果公司提供了许多示例代码项目,这些项目和文档应该会让您了解如何做到这一点


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

这相当简单。在子视图中,您应该(真的,真的应该)引用您正在使用的
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
(您也应该这样做)将自行处理。

这相当简单。在子视图中,您应该(真的,真的应该)引用您正在使用的
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
(您也应该这样做),因此它将自行处理。

如果您不使用
NSFetchedResultsController
,则只需实现以下方法:


-(void)tableView:(UITableView*)tableView提交的编辑样式:(UITableViewCellEditingStyle)行的编辑样式索引路径:(NSIndexPath*)索引路径{

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


currentRows
是您在表中显示的对象数组。


干杯

如果不使用
NSFetchedResultsController
,只需实现以下方法:


-(void)tableView:(UITableView*)tableView提交的编辑样式:(UITableViewCellEditingStyle)行的编辑样式索引路径:(NSIndexPath*)索引路径{

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


currentRows
是您在表中显示的对象数组。


干杯

通常能够删除子视图中的项目。例如,在mail应用程序中,您既可以在tableview中删除,也可以在detail视图中删除。我想知道是否需要重新加载数据,但是如果我的表视图包含大量的数据,该怎么办(情况并非如此,但我想知道最佳做法):当只有一个对象消失时重新加载整个模型不是很糟糕吗?您还可以查看UITableView的-deleteRowsAtIndexPaths:withRowAnimation:它通常能够删除子视图中的项目。例如,在mail应用程序中,您既可以在tableview中删除,也可以在detail视图中删除。我想知道如何重新加载数据,但是如果我的表视图包含大量数据(事实并非如此,但我想知道最佳做法):当只有一个对象消失时重新加载整个模型不是很糟糕吗?您还可以查看UITableView的-deleteRowsAtIndexPaths:withRowAnimation:谢谢,这真的很干净,我做到了,它解决了我的问题。谢谢,这真的很干净,我做到了,它解决了我的问题。