最近开始开发应用程序,请原谅我的无知。我有一个tableView,当单击表视图中的单元格时,我想在它下面插入一个新行。这当前适用于我的代码。但是,我还希望在再次单击单元格后删除已插入的行。这给了我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 :(得分:1)
这只是一个猜测,但是在调用
的情况下包装更改表结构的代码是个好主意。[tableView beginUpdates];
[tableView endUpdates];
答案 1 :(得分:0)
我敢打赌这会返回null:[NSIndexPath indexPathForRow:expandedRow inSection:0];如果它真的吹了...
HTH
答案 2 :(得分: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.这是我对这个问题的快速解决方法,虽然我确信有更好的解决方法。