Iphone 处理UITableViewController中的行删除
我有一个导航控制器。第一个级别是UITableViewController,第二个级别仅显示表视图中某个项的详细信息 在此详细视图中,我可以删除该项。它删除基础托管对象 当我弹回到视图时,我有一个崩溃。我理解为什么,因为我没有更新包含数据的缓存数组 我看了几个教程,但我不太明白我应该如何处理删除。也许我不太清楚应该在模型中的什么位置获取对象。我是否应该对每个cellForRowAtIndexPath进行查询,并将结果中的项置于indexPath.row位置?看起来效率不高。我是否应该检查某个地方的更改并在数组中重新检查整个查询。我认为CoreData会提供一些更自然的东西,但我目前还没有找到Iphone 处理UITableViewController中的行删除,iphone,core-data,uitableview,Iphone,Core Data,Uitableview,我有一个导航控制器。第一个级别是UITableViewController,第二个级别仅显示表视图中某个项的详细信息 在此详细视图中,我可以删除该项。它删除基础托管对象 当我弹回到视图时,我有一个崩溃。我理解为什么,因为我没有更新包含数据的缓存数组 我看了几个教程,但我不太明白我应该如何处理删除。也许我不太清楚应该在模型中的什么位置获取对象。我是否应该对每个cellForRowAtIndexPath进行查询,并将结果中的项置于indexPath.row位置?看起来效率不高。我是否应该检查某个地方
提前感谢。从详细信息控制器中删除父控制器中的项目似乎有点不标准,但在您的情况下可能会有意义。我假定您知道可以直接删除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:谢谢,这真的很干净,我做到了,它解决了我的问题。谢谢,这真的很干净,我做到了,它解决了我的问题。