2012-04-18 99 views
0

最近开始开发应用程序,所以请原谅我的无知。我有一个tableView,当单击表格视图中的一个单元格时,我想直接在它下面插入一个新行。这目前在我的代码中工作。但是,我也希望一旦单元格被再次点击,已插入的行将被删除。这是给我NSRangeException说我超出了我的数组范围。iOS - NSRangeException仅当断点被禁用时

我想这可能与我的tableView委托/数据方法有关,所以我在每个方法中设置了断点。随着断点的启用,单元格被完美删除。但是,当我禁用断点并让应用程序自行运行时,它会崩溃。突破点可能如何影响这一点?

下面是相关的代码:

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

- (NSInteger)tableView:(UITableView *)songTableView 
numberOfRowsInSection:(NSInteger)section{ 
    bool debug = false; 

    if (debug) NSLog(@"--TableView: rankings"); 
    if (expandedRow == -1) 
     return [self.songs count]; 
    else //one row is expanded, so there is +1 
     return ([self.songs count]+1); 

} 

- (UITableViewCell *)tableView:(UITableView *)songTableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

     bool debug = false; 
     if (debug) NSLog(@"--tableView: tableView"); 

     NSUInteger row = [indexPath row]; 
     if (row == expandedRow){ //the expanded row, return the custom cell 
      UITableViewCell *temp = [[UITableViewCell alloc] 
            initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"test"]; 
      return temp; 
     } 
     UITableViewCell *cell = [tableViewCells objectAtIndex:row]; 
     return cell; 
    } 
} 

- (NSString *)tableView:(UITableView *)songTableView 
titleForHeaderInSection:(NSInteger)section{ 
     //todo: call refresh title 
     return @"The Fresh List"; 
} 

- (CGFloat)tableView:(UITableView *)songTableView 
heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
     return 44.0; //same as SongCell.xib 

} 


- (void)tableView: (UITableView *)songTableView 
didSelectRowAtIndexPath: (NSIndexPath *)indexPath { 
    bool debug = true; 
    //todo: if the user selects expanded cell, doesn't do anything 
     SongCell *cell = (SongCell *)[songTableView cellForRowAtIndexPath:indexPath]; 
     if (cell->expanded == NO){ 
      //change cell image 
      cell.bgImage.image = [UIImage imageNamed:@"tablecellbg_click.png"]; 
      cell->expanded = YES; 

      //add new cell below 

      NSInteger atRow = [indexPath row] + 1; 
      NSIndexPath *insertAt = [NSIndexPath indexPathForRow:atRow inSection:0]; 
      NSArray *rowArray = [[NSArray alloc] initWithObjects:insertAt, nil]; 

      if (debug) NSLog(@"Expanded row: %d", atRow); 
      expandedRow = atRow; 

      [tableView insertRowsAtIndexPaths:rowArray withRowAnimation:UITableViewRowAnimationTop]; 

     }else { //cell is already open, so close it 
      //change cell image 
      cell.bgImage.image = [UIImage imageNamed:@"tablecellbg.png"]; 
      cell->expanded = NO; 

      NSIndexPath *removeAt = [NSIndexPath indexPathForRow:expandedRow inSection:0]; 
      NSArray *rowArray = [[NSArray alloc] initWithObjects:removeAt, nil]; 
      if(debug) NSLog(@"--about to delete row: %d", expandedRow); 

      expandedRow = -1; 
      [tableView deleteRowsAtIndexPaths:rowArray withRowAnimation:UITableViewRowAnimationTop]; 

      //remove expaned cell below 
     } 

} 

回答

0

我讨厌一个好主意回答我自己的问题,但我明白了。

我从对象数组中加载我的tableView。当我添加单元格时,该数组仍然只保存了30个对象,而我的表格保存了31个。我正确地返回了numberOfRowsInSection方法。

这是我所做的修改。注意另外如果:

NSUInteger row = [indexPath row]; 
     if (row == expandedRow){ //the expanded row, return the custom cell 
      if(debug) NSLog(@"row == expandedRow"); 
      UITableViewCell *temp = [[UITableViewCell alloc] 
            initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"test"]; 
      return temp; 
     } 
     else if (expandedRow != -1 && row > expandedRow) 
      row--; 

我的数组对象和UITableViewCells假设匹配1-1。在展开的行之后,indexPath的行因为关闭了1.这是我对此问题的快速解决方法,尽管我确信有更好的方法可以解决此问题。

0

我打赌这个返回null:[NSIndexPath indexPathForRow:expandedRow切入口:0];如果确实如此它吹...

心连心

+0

不,不是,我把NSLog放在方法的顶部。事实证明,它甚至在调用DidSelectRow之前崩溃了...... – CHawk 2012-04-18 23:54:00

1

这只是一个猜测,但它的包装代码,改变调用表结构

[tableView beginUpdates]; 
[tableView endUpdates];