删除表格视图单元格但显示“无效行数”

时间:2013-02-21 15:50:03

标签: iphone ios uitableview core-data

我的tableview数据来自一个数组,它从托管对象上下文的executeFetchRequest方法获取数据。在commitEditingStyle委托中,我收到此错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0.  The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (1),

代表:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [self.managedOjbectContext deleteObject:[self.myEvents objectAtIndex:indexPath.row]];
        [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [self.tableView reloadData];
    }
}

5 个答案:

答案 0 :(得分:1)

您应该从NSArray中删除该条目,然后重新加载tableView,这样就不会出现不一致...

答案 1 :(得分:1)

错误说明了一切,你删除了一行,但你的代表仍然说它在那里。

我的猜测是你没有从self.myEvents删除你的对象。从托管上下文中删除对象不会将其从阵列中删除。

假设self.myEventsNSMutableArray*

[self.myEvents removeObjectAtIndex:indexPath.row]

答案 2 :(得分:0)

尝试使用[tableView beginUpdates];[tableView endUpdates];不要像这样使用reloadData

[tableView beginUpdates];
if (editingStyle == UITableViewCellEditingStyleDelete) {
        [self.managedOjbectContext deleteObject:[self.myEvents objectAtIndex:indexPath.row]];
        [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

    }
[tableView endUpdates];

答案 3 :(得分:0)

为什么不在[self.tableView beginUpdates][self.tableView endUpdates]

之间封装删除和全部内容
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [self.tableView beginUpdates];
        [self.managedOjbectContext deleteObject:[self.myEvents objectAtIndex:indexPath.row]];
        [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [self.tableView endUpdates];
    }

}

根据:Apple's Table View Programmming Guidelines

答案 4 :(得分:0)

如果从TableView中删除单元格,则需要更新数据源以识别这些更改。

有一个名为numberOfRowsInSection的方法:此方法返回表视图应显示的单元格数。它很可能使用数组或其他类型的数据结构。您需要确保此数组与对表视图本身所做的任何更改保持同步。如果告诉表视图删除视图,则还需要更新表视图的后备数据以反映更改。