0

I have a gesture on a UITableViewCell subclass called ArticleCell, so when it is swiped a method in the UITableViewController class gets called to delete the cell that was swiped.

The delegate method looks like this:

- (void)swipedToRemoveCell:(ArticleCell *)articleCell {
    NSIndexPath *indexPath = [self.tableView indexPathForCell:articleCell];

    [self.tableView beginUpdates];
    [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.tableView endUpdates];

    [self.tableView reloadData];
}

But every time I swipe, I get this error:

Invalid update: invalid number of rows in section 0

More information: It uses Core Data for the data source, so it uses NSFetchedResultsController. Do I have to update something there? (I haven't touched any of its methods.)

4

4 回答 4

2

您始终还需要从数据源对象中删除该行。在从表视图本身删除表示数据的行的同时,您需要将其从 Core Data 存储中删除。

问题是这种不匹配,您从表视图中删除了该行,但您的-numberOfRowsInTableView数据源方法仍然返回旧的行数,因为获取的结果控制器仍然在数据存储中看到该数字。

于 2013-05-02T23:15:59.277 回答
1

发生这种情况是因为当您删除行但没有从列表中删除实际对象时,因此它返回错误的行数或节数。你也应该更新你的列表。

在删除行时,您不需要重新加载数据,因为它已经在执行另一件事。

于 2013-05-02T23:30:33.820 回答
0

由于您使用的是核心数据,因此您可以这样做

在您的删除操作中调用此代码

NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];

[self.fetchedResultsController.managedObjectContext deleteObject:object];

覆盖这个 fetchcontroller 委托....

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath
{
    UITableView *tableView = self.tableViewIB;

    switch(type) {
        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationMiddle];
            break;

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

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

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}
于 2013-05-03T07:22:13.310 回答
0

通过从数组中删除该对象并在此之后重新加载 tableView 直接使用它:

- (void)swipedToRemoveCell:(ArticleCell *)articleCell {
    NSIndexPath *indexPath = [self.tableView indexPathForCell:articleCell];

    [DATASOURCE_ARRAY removeObjectAtIndex:indexPath.row]; // Here DATASOURCE_ARRAY is the array you are using as datasource of tableView
    [self.tableView reloadData];
}

希望它可以帮助你。

于 2013-05-03T05:32:46.040 回答