UITableView insertRowsAtIndexPaths:

时间:2012-01-29 19:44:47

标签: iphone objective-c ios uitableview

我有一个包含uitableview的导航控制器,当我按下一行时,它会在堆栈上弹出一个新的视图控制器,用于在详细信息视图中显示详细信息,它从服务器发出请求以获得一些响应信息然后一旦返回信息,我使用insertRowsAtIndexPaths:显示从服务器返回的信息。

这一切都很好,第一次,然后当我按下后退按钮并选择一个新行或同一行查看详细信息后,我insertRowsAtIndexPaths:被调用我得到以下错误:

*** 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 (2) must be equal to the number of rows contained in that section before the update (2), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

以下是在堆栈上推送视图的代码:

VideoDetailViewController_iPhone *nextView = [[VideoDetailViewController_iPhone alloc] initWithNibName:@"VideoDetailViewController_iPhone" bundle:nil withVideo:rowData];
    nextView.navController = navController;
[navController pushViewController:nextView animated:YES];
[nextView release];

以下是从服务器返回信息后执行的代码

    - (void)fetchVideoDetail:(NSNotification *)notification {
        hasLoadedResponses = YES;

        NSArray *obj = (NSArray *)[notification object];
        responses = [[obj valueForKey:@"responses"] mutableCopy];
        //NSLog(@"RESPONSES: %@", responses);
        if ([responses count] == 0) {
            [tblView reloadData];
            return;
        }

        NSMutableArray *indexes = [[NSMutableArray alloc] init];

        int i = 0;
        for (NSArray *x in responses) {
            if (i > 0) {
                //The reason for skipping the first one is because we will change that row once the table refreshes we just need to insert any rows after the first one.
                [indexes addObject:[NSIndexPath indexPathForRow:i inSection:1]];
            }
            i++;
        }
        //NSLog(@"indexCount: %i", [indexes count]);
        [tblView beginUpdates];
        [tblView insertRowsAtIndexPaths:indexes withRowAnimation:UITableViewRowAnimationBottom];
        [tblView endUpdates];
        //[tblView reloadData];
    }

这是tableView方法:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    if (section == 0) {
        return 1;
    } else {
        if ([responses count] == 0) {
            NSLog(@"numberofrowsinsection: 1");
            return 1;
        } else {
            NSLog(@"numberofrowsinsection: %i", [responses count]);
            return [responses count];
        }
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    VideoCell *cell = (VideoCell *)[tableView dequeueReusableCellWithIdentifier:CellClassName];
    if (cell == nil) {
        NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil];
        cell = [topLevelItems objectAtIndex:0];
    }

    if (indexPath.section == 0) {
            cell.lblTitle.text = [data title];
            cell.lblDescription.text = [data videoDescription];
    } else {
        if ([responses count] == 0) {
            if (!hasLoadedResponses) {
                cell.lblTitle.text = @"";
                cell.lblDescription.text = @"";
            } else {
                //Responses have been loaded
                cell.accessoryType = UITableViewCellAccessoryNone;
                cell.selectionStyle = UITableViewCellSelectionStyleNone;

                cell.lblTitle.text = @"No responses to this video";
                cell.lblDescription.text = @"Be the first to respond by selecting the \"Set as Destination\" button above";
            }
        } else {
            //Display the response information
            cell.lblTitle.text = [[responses objectAtIndex:indexPath.row] valueForKey:@"title"];
            cell.lblDescription.text = [[responses objectAtIndex:indexPath.row] valueForKey:@"description"];
        }
    }

    return cell;
}

1 个答案:

答案 0 :(得分:1)

您的数据源和行数不同步。插入行时,必须同时增加该部分中的行数。在这种情况下,您必须增加您在responses方法中使用的数组numberOfRowsInSection的数量。