在uitableview iphone中插入行时出现'NSInternalInconsistencyException'

时间:2012-04-04 07:05:44

标签: iphone uitableview cell rows

在我的应用中,我使用NSNotificationCenter批量返回10个用户对象。当我得到10个对象时,我想在表视图中插入该数据。为此,我使用以下代码

- (void)viewDidAppear:(BOOL)animated {

    recordCounter = 0;
    noOfRowsCounter = 0;

    // Some code
}

- (void) gotNotification: (NSNotification *) notification {

    NSMutableArray *tempArray = [[notification userInfo]valueForKey:KEY];

    NSLog(@"recordCounter BEFORE=> %d",recordCounter);
    NSLog(@"noOfRowsCounter BEFORE=> %d",noOfRowsCounter);

    self.insertIndexPaths = [[NSMutableArray alloc] init]; 
    for (User *user in tempArray) 
    {
        [self.contactsArray addObject:user];

        recordCounter++;
    }

    for (noOfRowsCounter = noOfRowsCounter; noOfRowsCounter < recordCounter; noOfRowsCounter++) {

        [self.insertIndexPaths addObject:[NSIndexPath indexPathForRow:recordCounter inSection:0]];

    }

    NSLog(@"recordCounter AFTER=> %d",recordCounter);
    NSLog(@"noOfRowsCounter AFTER=> %d",noOfRowsCounter);
    NSLog(@"self.insertIndexPaths count=> %d",[self.insertIndexPaths count]);
    [contactsTableView beginUpdates];
    [contactsTableView insertRowsAtIndexPaths:self.insertIndexPaths 
                             withRowAnimation:UITableViewRowAnimationNone];
    [contactsTableView endUpdates];

    [self.insertIndexPaths removeAllObjects];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    // I am doing this as I have 2 records in single row

    if ([self.insertIndexPaths count]%2 == 0) {

        NSLog(@"In IF::rows:: %d",[self.insertIndexPaths count]/2);
        return [self.insertIndexPaths count]/2;
    }
    else {
        NSLog(@"In ELSE::rows:: %d",[self.insertIndexPaths count]/2+1);
        return [self.insertIndexPaths count]/2 + 1;
    }
}

如果我运行我的应用程序,我会收到以下错误&amp;我的应用程序崩溃了。这是我的控制台日志

    2012-04-04 12:15:36.559 AppName[1742:6803] recordCounter BEFORE=> 0
2012-04-04 12:15:36.563 AppName[1742:6803] noOfRowsCounter BEFORE=> 0
2012-04-04 12:15:38.539 AppName[1742:6803] recordCounter AFTER=> 10
2012-04-04 12:15:38.543 AppName[1742:6803] noOfRowsCounter AFTER=> 10
2012-04-04 12:15:38.546 AppName[1742:6803] self.insertIndexPaths count=> 10

2012-04-04 12:15:42.971 AppName[1742:6803] In IF::rows:: 5

2012-04-04 12:15:44.292 AppName[1742:6803] *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-1448.89/UITableView.m:995
2012-04-04 12:15:44.306 AppName[1742:6803] *** 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 (5) 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 (10 inserted, 0 deleted).'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x36c4164f __exceptionPreprocess + 114
    1   libobjc.A.dylib                     0x332fec5d objc_exception_throw + 24
    2   CoreFoundation                      0x36c41491 +[NSException raise:format:arguments:] + 68
    3   Foundation                          0x334ec573 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 62
    4   UIKit                               0x30ca4379 -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 4500
    5   UIKit                               0x30cae2f9 -[UITableView endUpdatesWithContext:] + 28
    6   UIKit                               0x30cae2d5 -[UITableView endUpdates] + 16
    7   AppName                       0x00004927 -[AppNameViewController batchNotification:] + 770
    8   Foundation                          0x334a4183 _nsnote_callback + 142
    9   CoreFoundation                      0x36c1020f __CFXNotificationPost_old + 402
    10  CoreFoundation                      0x36baaeeb _CFXNotificationPostNotification + 118
    11  Foundation                          0x334a15d3 -[NSNotificationCenter postNotificationName:object:userInfo:] + 70
    12  AppName                       0x00007705 -[AddressBook getAddressBookData] + 1700
    13  AppName                       0x0000447b -[AppNameViewController retriveAddressBookData] + 102
    14  Foundation                          0x334b3389 -[NSThread main] + 44
    15  Foundation                          0x335255cd __NSThread__main__ + 972
    16  libsystem_c.dylib                   0x350c0311 _pthread_start + 248
    17  libsystem_c.dylib                   0x350c1bbc start_wqthread + 0
)
terminate called after throwing an instance of 'NSException'

我想在表格视图中添加这些记录。我怎样才能做到这一点。感谢

更新:cellForRowAtIndexPath的代码

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    ContactCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 
    {
        NSArray *cellArray=[[NSBundle mainBundle] loadNibNamed:@"ContactCell" owner:self options:nil];
        //NSLog(@"cellArray count => %d",[cellArray count]);
        cell=[cellArray objectAtIndex:0];
    }

    // Configure the cell...

    // For showing 2 records in single row

    int row = indexPath.row * 2;
    if (row <= [self.contactsArray count]) 
    {
        User *user = [self.contactsArray objectAtIndex:row];
        NSLog(@"In ROW: %@",user.firstName);
        cell.firstNameLabel.text=[NSString stringWithFormat:@"%@",nameString];
    }

    if ((row + 1) < [self.contactsArray count]) 
    {

        User *user = [self.contactsArray objectAtIndex:row+1];
        NSLog(@"In ROW+1: %@",user.firstName);
        cell.secondNameLabel.text=[NSString stringWithFormat:@"%@",nameString];
    }

     return cell;
}

2 个答案:

答案 0 :(得分:1)

根据您的数据,您在部分行中返回5个但是您的 self.insertIndexPaths有10个索引路径

[contactsTableView insertRowsAtIndexPaths:self.insertIndexPaths 
                         withRowAnimation:UITableViewRowAnimationNone];

这些行指定插入10行,如更新后的行数中的错误中明确提到的应该等于段中行数返回的值。

替换

 for (noOfRowsCounter = noOfRowsCounter; noOfRowsCounter < recordCounter; noOfRowsCounter++) {

        [self.insertIndexPaths addObject:[NSIndexPath indexPathForRow:recordCounter inSection:0]];

    }

    int presentrows = [yourtablename numberOfRowsInSection:0];
    int Finalnumberofrows;
    if ([self.insertIndexPaths count]%2 == 0) {
    Finalnumberofrows = [self.contactsArray count]/2;
}
else {
    Finalnumberofrows = [self.contactsArray count]/2 + 1;
}
    for (presentrows; presentrows < Finalnumberofrows; presentrows++) {

    [self.insertIndexPaths addObject:[NSIndexPath indexPathForRow:presentrows inSection:0]];

}

并替换 索引方法的行的表视图单元格 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

// I am doing this as I have 2 records in single row

if ([self.contactsArray count]%2 == 0) {

    NSLog(@"In IF::rows:: %d",[self.insertIndexPaths count]/2);
    return [self.contactsArray count]/2;
}
else {
    NSLog(@"In ELSE::rows:: %d",[self.insertIndexPaths count]/2+1);
    return [self.contactsArray count]/2 + 1;
}

}

答案 1 :(得分:0)

由于未捕获的异常,终止应用后列出了真正的错误 它说:第0节中的行数无效。更新后的现有部分中包含的行数(5)必须等于更新前的该部分中包含的行数(0),或者减去从该部分插入或删除的行数(插入10个,删除0个)

那么,问题是什么?你有0行,然后插入10,现在说它有5个?没有任何意义。您应该检查-tableView:numberOfRowsInSection:实施。

我只是看到你想在一行中显示两条记录。真的,这毫无意义。它使得表格视图动画不必要地复杂化 但是,如果你想坚持下去,你可能不会告诉表你插入了10行但是5行。