使用 NSFetchedResultsController 从 UITableView 中删除
Posted
技术标签:
【中文标题】使用 NSFetchedResultsController 从 UITableView 中删除【英文标题】:Delete from UITableView using an NSFetchedResultsController 【发布时间】:2013-05-06 09:09:59 【问题描述】:我有一个通过 NSFetchedResultsController 填充的 UITableView。当用户向右滑动一个项目时,我会出现一个删除按钮,以便他/她可以使用以下方法删除该对象:
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
// Return NO if you do not want the specified item to be editable.
return YES;
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
return YES;
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
if (editingStyle == UITableViewCellEditingStyleDelete)
//perform similar delete action as above but for one cell
XMPPUserCoreDataStorageObject *user = [[self fetchedResultsController] objectAtIndexPath:indexPath];
NSLog(@"User delete: %@", [user displayName]);
//delete from fetchController
NSArray *sections = [[self fetchedResultsController] sections];
int userStatus = [[user sectionNum] intValue];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
但是当我这样做时会出现异常,因为我没有更新我的 fetchedResultsController 模型。问题是如何使用我从 commitEditingStyle 获得的 indexPath 从 fetchedController 中删除?
【问题讨论】:
【参考方案1】:由于您使用的是NSFetchedResultsController
,您只需要从上下文中删除对象,它就会获取更改并为您删除行。
所以删除deleteRowsAtIndexPaths:
行并改为调用它:
[self.fetchedResultsController.managedObjectContext deleteObject:user];
【讨论】:
我得到:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 0 节中的行数无效。更新后现有节中包含的行数 (11)必须等于更新之前该节中包含的行数 (11),加上或减去从该节插入或删除的行数(0 插入,1 删除),加上或减去移入或删除的行数离开该部分(0 移入,0 移出)。' @user1845360:你必须删除对象,但你必须不调用deleteRowsAtIndexPaths
。这是稍后在 FRC 委托方法中完成的。【参考方案2】:
看看这个Answer,你要做的就是从你的数据库和NSFetchedResultsController中删除一个NSManagedObject。
【讨论】:
以上是关于使用 NSFetchedResultsController 从 UITableView 中删除的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 3 中难以配置 NSFetchedResultsController