0

当我尝试从我的单元格中删除一个单元格时,UITableView它给了我这个错误:

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1912.3/UITableView.m:1046 2012-08-02 16:35:13.941 jsontest2[1551:f803] *** 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 (4) must be equal to the number of rows contained in that section before the update (4), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).' *** First throw call stack: (0x13e0052 0x1571d0a 0x1388a78 0x9c02db 0xbb518 0xc6211 0xc623f 0x2ce9 0xd289d 0x226d70 0x13e1ec9 0x3a5c2 0x3a55a 0xdfb76 0xe003f 0xdf2fe 0x5fa30 0x5fc56 0x46384 0x39aa9 0x12cafa9 0x13b41c5 0x1319022 0x131790a 0x1316db4 0x1316ccb 0x12c9879 0x12c993e 0x37a9b 0x1c22 0x1b95) terminate called throwing an exception**

这是我的代码:

- (void)tableView:(UITableView *)tableView
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    [tabela beginUpdates]; 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    {
        // Get the TAG and ID of Bill to delete
        //UITableViewCell * cell = [self tableView:tabela cellForRowAtIndexPath:indexPath];
        //NSLog(@"%d", cell.tag);

        [tabela deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:YES];      

    }   

    [tabela endUpdates];
    [tabela reloadData];

}

谢谢您的帮助!

编辑

self.billsArray = [[NSMutableArray alloc] init];
self.billsArray = [resultsDictionary objectForKey:@"bills"];

4

2 回答 2

5

在您的 billsArray 中,确保并删除正在删除的相应对象。

[billsArray removeObjectAtIndex:indexPath.row];

以下是输出的提示:

更新后现有节中包含的行数 (4) 必须等于更新前该节中包含的行数 (4),加上或减去从该节中插入或删除的行数(0 插入, 1 已删除)并加上或减去移入或移出该部分的行数

所以你的 UITableView 几乎是在说:

“好的,我有 20 行(来自 [billsArray 计数]。现在我想删除一行,这意味着我应该总共有 19 行......但我的代表说我应该有 20 行......哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇

因此,每当您删除一行时,请确保并从您的数据数组中删除该对象。或者,如果您添加一行,请确保将其添加到您的数据数组中。

编辑:(响应 OP 编辑​​)。

有你的问题。

self.billsArray = [resultsDictionary objectForKey:@"bills"]; 

这将创建一个只读数组。

你需要做的是:

self.billsArray = [[NSMutableArray alloc] initWithArray:[resultsDictionary objectForKey:@"bills"]];

或者

self.billsArray = [NSMutableArray arrayWithArray:[resultsDictionary objectForKey:@"bills"]];

或者你可以这样做(不是一个干净的方法):

NSMutableArray *temp = [resultsDictionary objectForKey:@"bills"];
self.billsArray = [temp mutableCopy];
于 2012-08-02T19:58:13.763 回答
0

如果你的表只有一个部分,你可以[billsArray removeObjectAtIndex:[indexPath row]]在方法中的某个地方调用,假设 billsArray 是一个NSMutableArray,而不是一个NSArray。如果不是,您可以将其更改为一个,或者将其内容复制到一个新的NSMutableArray中,然后将该数组用作表数据源。

于 2012-08-02T19:58:02.513 回答