0

我在NSMutableSet使用核心数据中删除对象时遇到问题。我试图在我的表格视图的第二部分中删除一个“播放器”对象。我收到错误消息;

无效更新:第 1 节中的行数无效。更新后现有节中包含的行数 (6) 必须等于更新前该节中包含的行数 (6),加上或减去数字从该部分插入或删除的行数(0 插入,1 删除)加上或减去移入或移出该部分的行数(0 移入,0 移出

解决方案

看看我的代码。

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


        if (indexPath.section==0) {

        }else{

            _player = [self.fetchedResultsController.fetchedObjects objectAtIndex: indexPath.row];
            [self.managedObjectContext deleteObject:_player];
            [self performFetch];
            [self.managedObjectContext save:nil];

            // here the solution to make it works...
            [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1]  withRowAnimation:UITableViewRowAnimationFade];               
        }            
    }   
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    switch(section){
        case 0:
            return 4;
        case 1:
            return [self.fetchedResultsController.fetchedObjects count];
    }
    return 0;
}
4

1 回答 1

1

一般当你需要从表格视图中删除或移除元素时,你需要执行一个两步操作:

  1. 处理模型
  2. 处理表格动画

你只表演了第一部分。要完成,您需要执行如下调用

[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
        withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];

如果您对表格执行多个动画,例如删除、修改等,则需要包装deleteRowsAtIndexPaths:withRowAnimation:中间。这里不是这种情况,但无论如何您都可以这样做。beginUpdatesendUpdates

NSFetchedResultsController当您使用核心数据时,您可以使用它的委托免费(您必须编写一些代码)NSFetchedResultsControllerDelegate。因此,当您通过调用(第 1 步)删除元素时deleteObject,委托将自动响应该更改并执行第 2 步。

查看如何使用 NSFetchedResultsController以了解如何正确设置它。

上面代码的修复是使用

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1]  withRowAnimation:UITableViewRowAnimationFade];

希望有帮助。

于 2012-07-08T13:14:04.617 回答