XCode - 目标C:删除表行崩溃

时间:2012-04-17 20:02:29

标签: xcode uitableview edit delete-row

欢迎!我整个上午都在为此工作,但没有香蕉;也许你有见解!

我正在使用标准NSMutableArray

self.itemTable = [[NSMutableArray alloc]
                 initWithObjects:@"House.",
                 @"Car.",
                 @"Keys.", nil];

现在,当我在导航栏中按“编辑”并删除一行时,我会收到错误消息

  

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

我将此代码用于'delete'命令:

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


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

}

有关如何使删除行功能有效的任何见解?

编辑

找到它:在工作中放置以下代码行:

[self.itemTable removeObjectAtIndex:indexPath.row];

哪个删除代码:

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

[self.itemTable removeObjectAtIndex:indexPath.row];

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

}

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。在找到解决方案之后。在这里,我的崩溃实际上是由于从数组中删除项目后调用tableview重新加载。在崩溃报告中,它提到在编辑/更新之前和之后,tableview中的行必须相等。

Bellow代码工作正常:

 // Override to support editing the table view.
 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
     if (editingStyle == UITableViewCellEditingStyleDelete)
     {
        //add code here for when you hit delete
        [self deleteItemAtRowIndex:indexPath];
    }
}


-(void)deleteItemAtRowIndex:(NSIndexPath *)indexpath
{
[pTableDataDataArray removeObjectAtIndex:indexpath.row];

[pTableView beginUpdates];
//[self LoadTempletesData];    no need to reload, simply remove row that to is to be delete
[pTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexpath] withRowAnimation:UITableViewRowAnimationNone];
//make changes
[pTableView endUpdates];
}

希望它有助于其他人

答案 1 :(得分:0)

(正如您似乎注意到的那样)您必须在插入或删除行之前更新数据源。有时你会想做一些像添加和删除行一样的东西。 (我这样做是为了隐藏行的子部分并显示另一部分)。如果您需要同时执行这两项操作,则可以使用此构造

[tableView beginUpdates];
//make changes
[tableView endUpdates];

答案 2 :(得分:0)

每次添加或删除表中的内容时,请记住更新数据源,该内容是从数据源本身提取的。