Getting strange error when reloading section index?

Rahul Vyas picture Rahul Vyas · Jan 8, 2010 · Viewed 7.6k times · Source

I am using the iPhone SDK and Objective-C and I get this error message:

Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-984.38/UITableView.m:774 2010-01-08 13:24:16.842 MyAPP[628:20b] Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 1. 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 (0), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted).

Here is my code to expand sections:

- (void)checkAction:(id)sender
{
    //The button is added as subview on a view and the view is section header custom view
    UIButton *Button = (UIButton*)sender;
    NSLog(@"Button Tag=%d",Button.tag);
    if([[self.MySectionIndexArray objectAtIndex:Button.tag] isEqualToString:@"UP"])
    {
        [self.MySectionIndexArray replaceObjectAtIndex:Button.tag withObject:@"DOWN"];
        [ButtonDrop setBackgroundImage:[UIImage imageNamed:@"Up.png"] forState:UIControlStateNormal];
        [TableDashBoard reloadSections:[NSIndexSet indexSetWithIndex:Button.tag] withRowAnimation:UITableViewRowAnimationFade];
    }
    else
    {
        [self.MySectionIndexArray replaceObjectAtIndex:Button.tag withObject:@"UP"];
        [ButtonDrop setBackgroundImage:[UIImage imageNamed:@"Down.png"] forState:UIControlStateNormal];
    }
    NSLog(@"self.MySectionIndexArray ka title = %@ at index Number=%d",self.MySectionIndexArray,Button.tag);
}

Answer

Adam Woś picture Adam Woś · Jan 8, 2010

The problem is because you're using reloadSections while changing the table's dataSource contents, so that it reports a different number of rows via tableView:numberOfRowsInSection:.

Check what you return from your UITableViewDataSource tableView:numberOfRowsInSection:. My bet is that at the beginning you return 0 for section 1, but when you call reloadSections, you return 1 for section 1.

If this is actually the case, you can use UITableView methods beginUpdates, insertRowsAtIndexPaths:withRowAnimation: and endUpdates.