4

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

连同所有必需的方法,但滑动删除操作不起作用。

任何与此相关的想法都会非常有帮助。

4

1 回答 1

13

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

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

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

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

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

于 2013-10-21T16:35:58.417 回答