2012-01-29 52 views
0

我有一个导航控制器,包含一个uitableview,当我按下一行时,它弹出一个新的视图控制器在堆栈上,它用于显示详细信息在详细信息视图中,它从服务器发出请求到获取一些响应信息,然后一旦返回信息,我使用insertRowsAtIndexPaths:来显示从服务器返回的信息。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; 
} 
+0

我不知道在向表中添加行的同时是否在响应中添加了新字段? – 2012-01-29 19:50:18

+0

当视图加载时,我只在第1部分有1行表示加载,那么一旦数据被加载,当行被插入到表中时 – dbslone 2012-01-29 20:25:35

+0

在插入新行时,[响应计数]是什么? – 2012-01-29 22:37:47

回答

1

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

+0

我很困惑你究竟是什么意思*“插入行时,必须同时增加该段中的行数。”*是否有办法手动增加行数? – 2016-03-25 22:28:34

+0

有一个方法'insertRowsAtIndexPaths',它将“插入行”,但你也必须增加'numberOfRowsInSection'的返回值来匹配新的数字。 – Mundi 2016-03-26 07:24:57

相关问题