2009-12-29 80 views
18

我正在嘗試填充多個部分的uitableview。 這是我的代碼:UITableView與cellForRowAtIndexPath問題

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 

case 1: 
[[cell textLabel] setText:[usersTeachers objectAtIndex:(indexPath.row+1)]]; 
return cell; 
break; 

我得到這個錯誤,當我嘗試加載的觀點:

2009-12-28 21:09:48.380 FSS[2046:207] *** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit/UIKit-984.38/UITableView.m:4709 
2009-12-28 21:09:48.381 FSS[2046:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:' 

陣列在指數日誌作爲一個合法的字符串,但它並沒有正確地返回小區。因此它不會加載過去這一點。請幫忙。

回答

2

不知道爲什麼你有「情況1:」獨自一人坐在那裏,但如果情況是1以外的情況,這將會消失,並且在此之後發生的任何事情都將返回。確保你總是返回一個單元格。

+0

我明白了。我設置了一個完整的switch語句。我只是用第一個例子來說明發生了什麼。它在發生錯誤之前不會運行另一個案例。 –

2

你可能沒有返回indexPath.row == 0的單元格(你的'case 1'是可疑的...)。但不能說,除非你發佈你的整個switch語句。

嘗試在switch語句之外返回'cell',您將會更好地理解發生了什麼。那麼你將不會有斷言失敗。

28

它看起來對我說,你有它返回一個細胞的情況下,1 你的錯誤讓我覺得你是在你的交換機的情況下返回一個空UITableViewCell一些分支部分可見的開關情況。

確保該開關外殼的所有路徑都返回有效的UITableViewCell對象。

什麼是你回來的情況下0?換句話說,你爲UITableView請求的第一行返回什麼?

這裏是代碼我的一個項目的樣本,它可能會給你一個很好的起點,看看你要去哪裏錯了:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    NSInteger section = [indexPath section]; 

    switch (section) { 
     case 0: // First cell in section 1 
      cell.textLabel.text = [collectionHelpTitles objectAtIndex:[indexPath row]]; 
      break; 
     case 1: // Second cell in section 1 
      cell.textLabel.text = [noteHelpTitles objectAtIndex:[indexPath row]]; 
      break; 
     case 2: // Third cell in section 1 
      cell.textLabel.text = [checklistHelpTitles objectAtIndex:[indexPath row]]; 
      break; 
     case 3: // Fourth cell in section 1 
      cell.textLabel.text = [photoHelpTitles objectAtIndex:[indexPath row]]; 
      break; 
     default: 
      // Do something else here if a cell other than 1,2,3 or 4 is requested 
      break; 
    } 
    return cell; 
} 
+2

+1正如你所說,幾乎可以肯定的是代碼缺少默認值:或者在某些代碼路徑上返回零。 –

+0

請幫我理解爲什麼我們給if(cell == nil) if(cell == nil){cell [= [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } 因爲如果cell == nil或if(!cell),它將永遠不會進入創建單元格的條件。 –

+0

如果我有1000個數值來自數據庫,那麼在這種情況下,我必須寫1000個案例嗎? –

2

檢查你有

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
2

好的,如果這個問題的所有其他解決方案不起作用,請確保Cell Identifier爲表視圖的單元格(在故事板)匹配您在tableviewdelegate代碼中使用的小區標識:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath  *)indexPath 
{ 
    static NSString *CellIdentifier = @"CustomCell"; 

在你的故事板的小區標識必須是「CustomCell」來匹配這個代碼。

-3

在我來說,我也有同樣的錯誤,因爲我錯過了分配/初始化:

if (cell == nil) { 
     cell = [[UITableViewCell alloc] init]; 

} 
+0

如果你看問題中的代碼,他正在做一個分配,但使用更具體的初始化程序。 – Abizern

+0

這將無法正常工作,@Abizern是正確的。 –

相關問題