简体   繁体   中英

Error trying to remove a cell from UITableView

when I try to remove a cell from my UITableView it gives me this error:

*** 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**

Here's my code:

- (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];

}

Thanks for the help!

EDIT

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

In your billsArray, make sure and remove the corresponding object that is being deleted.

[billsArray removeObjectAtIndex:indexPath.row];

Here is the hint from the output:

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

So your UITableView is pretty much saying:

"Ok, I have 20 rows (which comes from [billsArray count]. Now I'm suppose to delete one row which means I should have 19 rows total....But my delegate is saying I should have 20 rows...Whhhattt dooo I dooo??? .....crash " - UITableView

So make sure and remove the object from your data array whenever you delete a row. OR if you add a row, make sure and add it to your data array.

EDIT: (In response to OP edit).

There is your problem.

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

This creates a read-only array.

What you need to do is this:

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

Or

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

Or you could do (not a clean method):

NSMutableArray *temp = [resultsDictionary objectForKey:@"bills"];
self.billsArray = [temp mutableCopy];

If your table has just one section, you could call [billsArray removeObjectAtIndex:[indexPath row]] somewhere in the method, assuming billsArray is an NSMutableArray , not an NSArray . If it isn't, you could either change it into one, or copy its contents into a new NSMutableArray , and then use that array as the table datasource.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM