使用NSFetchedResultsController滑动以删除表中的单元格

ami*_*jaj 4 core-data uitableview nsfetchedresultscontroller ios

我以前有一个工作实现,我有一个TableViewController,我按下ADD按钮,它会调出另一个视图控制器,让用户可以向字段添加文本 - 这反过来又将这些信息添加到实体和属性,我可以显示表视图中的那个.实现以下方法,我可以滑动以成功删除行:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        [self.managedObjectContext deleteObject:[self.transactions objectAtIndex:indexPath.row]];
        [self.transactions removeObjectAtIndex:indexPath.row];
        [self.tableView reloadData];

        NSError *error = nil;
        if (![self.managedObjectContext save:&error])
        {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
            [self.tableView reloadData];
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,我已成功实现了NSFetchedResultsController以允许添加和获取信息的相同功能,但更安全.我现在无法弄清楚的是如何实际实现相同的滑动来删除功能.

我补充说:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

我添加了这个,并且"滑动"手势无法删除单元格.

在数据源的NSFetchedReusltsController代码中,我有:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {

    UITableView *tableView = self.tableView;

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray
                                               arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:[NSArray
                                               arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

以及所有必需的方法,但滑动删除操作只是不起作用.

对此有任何想法都会非常有帮助.

Mar*_*n R 11

要从表中删除行,您只需删除相应的Core Data对象:

if (editingStyle == UITableViewCellEditingStyleDelete)
{
    [self.managedObjectContext deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

    NSError *error = nil;
    if (![self.managedObjectContext save:&error]) {
        // handle error
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是全部,特别是你不需要打电话reloadData.删除对象会触发提取的结果控制器委托方法,并更新表视图.

现在从你的代码看来你有一个数据源数组self.transactions.这是错误的,你应该删除它.所有数据源方法都必须直接从获取的结果控制器获取信息.