为什么删除UITableView行时发生错误?

时间:2011-12-05 20:35:11

标签: iphone objective-c ios uitableview

我正在尝试使用Apple Table View编程指南中描述的标准编辑控件样式来实现UITableViewCell的标准删除。当以下代码在commitEditingStyle方法

中执行时
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

我收到以下错误消息

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第2节中的行数无效。更新后的现有部分中包含的行数(1)必须等于更新前该部分中包含的行数(1),加上或减去从该部分插入或删除的行数(插入0,删除1)。

2 个答案:

答案 0 :(得分:4)

您必须从数据源中删除单元格所代表的对象以及删除单元格:

[myObjectsArray removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

答案 1 :(得分:2)

如果它是唯一的一行,我建议您也删除该部分。您还需要将数据源与表同步,即删除数据源中的行。

当文件系统是iOS中的数据源时,这是一个正确的示例:

 // Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
 {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
    // Delete the row from the data source.
        File *file = (File *)[self.files objectAtIndex:indexPath.row];
        [[NSFileManager defaultManager] removeItemAtPath:file.path error:nil];
        [self.files removeObject:file];
        if (indexPath.row == 0 && [self.files count] == 0) {
            NSInteger sectionIndex = [indexPath indexAtPosition:0];
            [tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
        }else {
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        }
        [self setupData];
    } else if (editingStyle == UITableViewCellEditingStyleInsert) {
    // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
    }   
}