关于ios:使用NSFetchedResultsController滑动以删除表中的单元格

Swipe to Delete a Cell in a Table using NSFetchedResultsController

我以前有一个可行的实现,其中只有一个TableViewController,按下ADD按钮,它调出了另一个视图控制器,使用户可以向字段中添加文本-依次将信息添加到实体和属性中,我可以在表格视图中显示它。实现以下方法,我可以滑动以成功删除行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- (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,以允许在添加和获取信息时使用相同的功能,但是更加安全。我现在不知道的是如何实际执行相同的滑动以删除功能。

我添加了:

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

我添加了此内容,"滑动"手势对删除单元格无效。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- (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
2
3
4
5
6
7
8
9
if (editingStyle == UITableViewCellEditingStyleDelete)
{
    [self.managedObjectContext deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

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

仅此而已,尤其是您无需调用reloadData
删除对象会触发
获取结果控制器委托方法,并更新表视图。

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