2011-07-12 7 views
0

カスタムセルを読み込んで、JSON文字列のデータをサーバーにロードしているTableViewがあります。 JSON文字列は、14個のID(id_array)の配列に解析されます。UITableViewは何らかの理由で同じセルをロードしています

[id_array objectAtIndex:indexPath.row]の場合はIDを取得し、サーバーからその行の詳細を取得し、セルのラベルと画像を設定します。

このアプリケーションを実行すると、UITableViewは表示行[0,1,2,3,4](セルの高さは70px)を読み込みます。 TableViewをスクロールすると、row [5]がロードされ、サーバーからデータをフェッチしますが、問題はそのポイントを超えています - TableViewは新しい行のサーバーから新しいデータを要求するのではなく、

しかし、アプリケーションが最初に実行されたときに表示されない(ロードされない)行[5]の新しいデータを要求します。

誰もが、なぜこのようなことが起こっているのか考えていますか? ありがとう!

編集:あなただけcell==nil場合、それはあなたの問題であるデータを設定している場合はここに私の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

です。 UITableは、テーブルビューのセルのキャッシュを構築します。セルがnilの場合は、新しいテーブルのみを作成します。したがって、は、毎回のデータを設定する必要があります。つまり、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

返事をありがとう、私は質問に、私の方法を追加しましたbtw。私はあなたの提案を試みたが、それはセルにロードされたデータでいくつかの奇妙な問題を引き起こす。私が下にスクロールすると、トップセルはリロードされるまで突然異なるデータを表示します。 –

+0

表示されている間違ったデータは、実際に再利用されたセルで、サーバーから更新されます。ラベルと画像を空にすると、間違ったデータが表示されるのではなく、何も表示されずに読み込まれます。私がやりたいことは、14個のセルをロードして、上下にスクロールするときにリロードしないことです。何とか可能ですか?ありがとう。 –

+0

この場合、コントローラはデータをプリロードして配列に格納する必要があります。必要に応じて、このキャッシュされた配列からセルデータを取り出す必要があります。 – MarkPowell

関連する問題