我有一个UINavigationController。第一级是UITableViewController,第二级只显示表视图的其中一项的详细信息。
在此详细视图中,我可以删除该项目。它删除基础托管对象。
当我回到视图时,我发生了崩溃。我理解为什么,这是因为我没有更新包含数据的缓存数组。
我查看了几个教程,但我并不完全理解我应该如何处理删除。也许我不明白我应该在哪里获取模型中的对象。我应该对每个cellForRowAtIndexPath执行查询,并在位置indexPath.row中获取结果中的项吗?它看起来效率不高。我应该检查某处的更改并在数组中重新缓存整个查询。我认为CoreData会提供更自然的东西,但到目前为止我找不到它。
提前致谢。
答案 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。
干杯