2012-10-11 110 views
0

我想數我的數組設置爲我的表中的行數,然後乘以2,因爲我有一個不可見的單元格在每個單元格之間,以使單元格看起來分離。每次我試圖構建,我得到這個錯誤:iOS數組返回錯誤

Terminating app due to uncaught exception 'NSRangeException', reason: '* -[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 2]'

這是我使用的代碼:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [xmlParser.calls count] * 2; 
} 

的cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    static NSString *CellIdentifier = @"Cell"; 
    static NSString *CELL_ID2 = @"SOME_STUPID_ID2"; 
    JointCAD *currentCall = [[xmlParser calls] objectAtIndex:indexPath.row]; 
    self.tableView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"texture3.png"]]; 

    [self.tableView setSeparatorColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"texture3.png"]]]; 

    if (indexPath.row % 2 == 1) { 
    UITableViewCell * cell2 = [tableView dequeueReusableCellWithIdentifier:CELL_ID2]; 

    if (cell2 == nil) { 
     cell2 = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
             reuseIdentifier:CELL_ID2]; 
     [cell2.contentView setAlpha:0]; 
     [cell2 setUserInteractionEnabled:NO]; 
     [cell2 setBackgroundColor:[UIColor clearColor]]; 
    } 
    return cell2; 
    } 

    TableViewCell *cell = (TableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
    cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    cell.callTypeLabel.text = currentCall.currentCallType; 
    cell.locationLabel.text = currentCall.location; 
    cell.unitsLabel.text = currentCall.units; 
    cell.stationLabel.text = [@"Station: " stringByAppendingString:currentCall.station]; 
    cell.contentView.layer.backgroundColor = [UIColor whiteColor].CGColor; 
    cell.contentView.layer.frame = CGRectMake(0, 0, cell.contentView.frame.size.width, cell.contentView.frame.size.height); 
    cell.contentView.layer.borderWidth = 1.0; 
    cell.contentView.layer.borderColor = [UIColor blackColor].CGColor; 

    if ([currentCall.county isEqualToString:@"W"]) { 
    cell.countyImageView.image = [UIImage imageNamed:@"blue.png"]; 
    } else { 
    cell.countyImageView.image = [UIImage imageNamed:@"green.png"]; 
    } 

    if ([currentCall.callType isEqualToString:@"F"]) { 
    cell.callTypeImageView.image = [UIImage imageNamed:@"red.png"]; 
    } else { 
    cell.callTypeImageView.image = [UIImage imageNamed:@"yellow.png"]; 
    } 
    return cell; 
} 
+0

在調試器中運行您的應用程序。您會看到一個堆棧跟蹤,顯示出哪一行代碼導致了問題。您發佈的代碼不是崩潰的原因。問題將會是一些嘗試從數組中訪問元素的行。 – rmaddy

+2

但是,你如何訪問你的單元格的值在' - tableView: cellForRowAtIndexPath:'method? 這是一個盲目的猜測,但我認爲你正在訪問相同的'xmlParser.calls'數組來訪問所有的單元格。''xmlParser.calls * 2' – mayuur

+0

提供你的 - tableView:cellForRowAtIndexPath:代碼 –

回答

0

編輯:

仔細一看。只需加上/2

JointCAD *currentCall = [[xmlParser calls] objectAtIndex:indexPath.row/2]; 

而且它會起作用。 剛剛從richard注意到相同的答案。


由於mayuur注意到:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

// n = [xmlParser.calls count] 
// Ok, we have n*2 items (but calls has only n!): 
return [xmlParser.calls count] * 2; 
// calls has n items in it, but you return n*2 items 

然後在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

// n = [xmlParser.calls count] 
// give me object from calls at index (which will be in range [0; n*2 - 1], 
// which could be beyond [0; n-1] which you originally have) 
JointCAD *currentCall = [[xmlParser calls] objectAtIndex:indexPath.row]; 

所以,你應該乘以2,以刪除或自己提出好的建議,你總是會得到這個錯誤,除非xmlParser.calls是一個em pty數組。

+0

你可能做錯了什麼,添加/ 2不應該導致這個,除非你改變別的東西 –

+0

太棒了。完美的作品。 *我犯了一個愚蠢的錯誤,並修復它:P –

0

錯誤發生在您正在執行類似cell.textLabel.text = [array objectAtIndex:indexPath.row];之類的操作時,它會超出範圍限制。但是,如果要求在兩者之間留下不可見(空白)單元格,則可以在UITableView數據源cellForRowAtIndexPath方法中設置一些if...else條件,以防止數組的限制。還要設置適當的return計數爲numberOfCells

有點像,如果你的數組中有4個值。所以會有3個不可見的細胞應該製成。

1st Cell

blank

2nd Cell

blank

3rd Cell

blank

4th Cell

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [xmlParser.calls count] + (([xmlParser.calls count]%2)+1); 
} 

在你cellForRowAtIndexPath方法, 做這樣的條件,

if(indexPath.row==0) 
{ 
    cell.textLabel.text = [array objectAtIndex:indexPath.row]; 
} 
else if((indexPath.row+1)%2!=0) 
{ 
    cell.textLabel.text = [array objectAtIndex:indexPath.row]; 
} 
else 
{ 
    NSLog(@"%d is blank cell",indexPath.row); 
} 
+0

我得到這個錯誤:終止應用程序由於未捕獲的異常'NSInvalidArgumentException',原因:'*** - [__ NSCFConstantString stringByAppendingString:]:無參數' –

+0

,如果我評論他們我仍然得到相同的錯誤:由於未捕獲異常'NSRangeException',原因:'*** - [__ NSArrayM objectAtIndex:]:索引2超出界限[0 .. 1]'終止應用程序' –

+0

@JonErickson,第一個錯誤是因爲你試圖在'NSString'中追加'nil'(空白)字符串,你應該像'if(str.lenght == 0){str = @「」; }'和第二個錯誤,我在回答中解釋了它。 – Hemang

0

你乘以陣列計數,沒什麼大不了的

return [xmlParser.calls count] * 2; 

但你應該劃分indexPath.row到2來獲得數據源的真實索引。該表假定您有一個大小爲2n的數據源,因此該表將使用indexpath訪問0..2n。

JointCAD *currentCall = [[xmlParser calls] objectAtIndex:(indexPath.row/2)] 
+0

這是行不通的(你犯了一個錯字,'indexPath.row/2',但不是'indexPath.row]/2') –

+0

@MANIAK_dobrii謝謝你指出 – richard