2012-01-25 48 views
2

我正在創建一個設置爲數據層次結構的iOS應用程序。我在第一頁添加和刪除對象或甚至轉換到下一頁沒有問題。問題發生在與第一頁完全相同的第二頁上。當我按下添加按鈕添加一個對象時,程序崩潰並返回錯誤SIGABRT。在索引路徑問題處插入行

[self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:YES]; << crashes on this line 

這裏是函數add拍了拍:

- (void)addTapped:(id)sender { 
    StudentDoc *newDoc = [[[StudentDoc alloc] initWithTitle:@"New Student" rating:0 thumbImage:nil fullImage:nil] autorelease]; 
    [_students addObject:newDoc]; 

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_students.count-1 inSection:0]; 
    NSArray *indexPaths = [NSArray arrayWithObject:indexPath];  
    [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:YES]; 

    [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionMiddle]; 
    [self tableView:self.tableView didSelectRowAtIndexPath:indexPath]; 
} 

在部分行數:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return _students.count; 
} 

我一直的印象是計數是什麼原因造成的問題,但我已經監視了計數並保持一致。

總的來說,我不知道爲什麼它會崩潰在這一點上,因爲它之前的頁面使用完全相同的功能在該頁面上添加對象。有任何想法嗎?

回答

0

我已經做了差不多了,儘管我把它分成兩行:

NSInteger idx = [_students count] - 1; 
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection:0]; 

我不知道這是否會有所作爲。

+0

仍然給了我在插入行,同樣的錯誤在索引路徑 – user1170015

+0

你可以把整個方法的內容寫入'@try {...} @catch(NSException * e){NSLog(@「exception%@」,[e description]); }'? –

2

通常,如果你搞砸了你的數組或行索引,你希望在控制檯中記錄一個異常,而不是SIGABRT。你有沒有在Xcode中啓用NSZombies和break-on-exceptions?這可能有助於診斷問題。

1

您應該將插入行放在開始更新和結束更新塊之間的索引路徑中。

- (void)addTapped:(id)sender { 

    StudentDoc *newDoc = [[[StudentDoc alloc] initWithTitle:@"New Student" rating:0 thumbImage:nil fullImage:nil] autorelease]; 
    [_students addObject:newDoc]; 

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_students.count-1 inSection:0]; 
    NSArray *indexPaths = [NSArray arrayWithObject:indexPath];  

    [self.tableView beginUpdates]; 
    [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:YES]; 
    [self.tableView endUpdates]; 

    [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionMiddle]; 
    [self tableView:self.tableView didSelectRowAtIndexPath:indexPath]; 

} 
0

要添加的對象到數據源,但在表中替換現有行,而不是增加一個,從而導致在indexPath一行但數據源陣列中的2項。

例如,如果_students中有一個項目,則會有一個索引路徑{0,0}。當您添加一行時,您將在indexPath {_students.count - 1,0}處添加它,這將是{1 - 1,0}或{0,0}。您的數據源應該與您插入或移除的任何indexPath匹配,並且在您的情況下,您始終以數據源中的一個項目結束於添加/刪除項目。

如果你總是想添加的,而不是一個項目,:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_students.count-1 inSection:0]; 

你想:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_students.count inSection:0];