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

时间:2013-10-21 15:54:23

标签: ios uitableview core-data nsfetchedresultscontroller

我以前有一个工作实现,我有一个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];
        }
    }

}

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

我添加了:

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

我添加了此功能,“滑动”手势无法删除单元格。

在数据源的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;
    }
}

以及所有必需的方法,但滑动删除操作无效。

对此的任何想法都会非常有用。

1 个答案:

答案 0 :(得分:11)

要从表中删除行,您只需删除相应的行 核心数据对象:

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

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

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

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