2011-07-12 36 views
0

我有一個TableView加載自定義單元格並從服務器上的JSON字符串加載數據。 JSON字符串被解析爲14個ID(id_array)的數組。UITableView正在加載相同的單元格某種原因

如果cell==nil,那麼我使用[id_array objectAtIndex:indexPath.row]來獲取ID並從服務器獲取關於該行的更多信息,並設置單元格的標籤和圖像。

當運行應用程序時,UITableView加載可見行[0,1,2,3,4](單元格高度爲70px)。 當向下滾動TableView時,行[5]被加載並從服務器獲取數據,但問題是超出這一點--TableView正在重複這6行,而不是從服務器爲新行請求新數據。

但它的確請求了行[5]的新數據,當應用程序第一次運行時,它不可見(也未加載)。

任何人都知道爲什麼會發生這種情況? 謝謝!

編輯:這是我的cellForRowAtIndexPath方法

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

    if (cell == nil) { 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil]; 

     for (id currentObject in topLevelObjects) { 
      if ([currentObject isKindOfClass:[UITableViewCell class]]) { 
       cell = (CustomCell *)currentObject; 

       NSString *appsURL = [NSString stringWithFormat:@"http://myAPI.com?id=%@",[app_ids objectAtIndex:indexPath.row]]; 
       NSLog(@"row -> %d | id -> %@",indexPath.row,[app_ids objectAtIndex:indexPath.row]); 
       NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:appsURL]]; 
       [cell updateAppInfoForCellWithRequest:request]; 

       break; 
      } 
     } 
    } 

    // Configure the cell... 

    return cell; 
} 
+4

如果您提高對以前某些問題的接受答案,則更有可能獲得幫助。 – highlycaffeinated

+0

您應該發佈整個cellForRow方法。 – Trevor

+2

同意高度無咖啡因,表示更多的人會花時間幫助你。 – MarkPowell

回答

3

如果要設置數據只有cell==nil,那就是你的問題。 UITable構建表格視圖單元的緩存,只在單元爲零時創建一個新的緩存。因此,必須每次設置您的數據,即在cell==nil塊之外。

下面的例子顯示了這個過程。首先,從池中獲取一個單元格,如果沒有空閒單元格,則創建一個新單元格。爲合適的行設置單元格的值。

- (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]; 
    } 

    id someData = [id_array objectAtIndex:indexPath.row] 

    cell.textLabel.text = [someData someString]; 

    return cell; 
} 
+0

感謝您的回覆,我已經將我的方法添加到問題,順便說一句。我嘗試了你的建議,但是它會導致加載到單元格的數據出現一些奇怪的問題。如果向下滾動,頂部單元會突然顯示不同的數據,直到它們重新加載。 –

+0

顯示錯誤的數據實際上是一個重用單元,然後從服務器更新。如果我清空標籤和圖像,那麼不顯示錯誤的數據,它不顯示任何內容,然後加載。我想要做的是加載14個單元格,而不是在滾動上下滾動時重新加載它們......有可能嗎?謝謝。 –

+0

對於這種情況,您的控制器應預加載數據並將其存儲在數組中。單元格數據應根據需要從此緩存陣列中提取。 – MarkPowell

相關問題