使用 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

为啥 beginUpdates/endUpdates 会重置表视图位置以及如何阻止它这样做?

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?