2010-11-24 5 views
0

dans ma table voir la taille de la cellule correspond à la taille de l'écran entier. donc il ne crée que deux cellules mais à partir de la 3ème cellule il utilise le contenu de l'ancienne cellule ... donc je reçois les données incorrectes ..uitableview chargement des cellules avec le contenu des cellules précédentes

comment résoudre ce problème ...?

merci.

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

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if(cell == nil) 
     cell = [[[UITableViewCell alloc] initWithFrame:CellFrame reuseIdentifier:CellIdentifier] autorelease]; 
    for(UIView *v in [cell.contentView subviews]) 
     [v removeFromSuperview]; 

     curCellNo = indexPath.row; 
     if(curCellNo == 0){ 
      min = 0; 
      max = 8; 
      x=0; 
      y=yForFirst; 
      col = 1; 
     }else{ 
      if(curCellNo < prevCellNo){ 
       min = min-12; 
       max = max-12; 

      }else{ 
       min = max; 
       max = min+12; 
      } 
      x=0; 
      y=0; 
     } 
     prevCellNo = curCellNo; 
     NSLog(@"Max...%d",max); 
     NSLog(@"Min...%d",min); 
     NSLog(@"songsCount...%d",[songs count]); 

     for(int i=min; i<max && i<[songs count]; i++){ 

      Song *thesong = [self.songs objectAtIndex:i]; 
      CGRect frame; 
      frame.size.width=coverWidth; frame.size.height=coverHeight; 
      frame.origin.x=x; frame.origin.y=y; 

      LazyImageView* asyncImage = [[[LazyImageView alloc] initWithFrame:frame]autorelease]; 
      NSURL* url = [NSURL URLWithString:thesong.cover]; 
      [asyncImage loadImageFromURL:url]; 

      UILabel *label = [[[UILabel alloc]initWithFrame:CGRectMake(x, y+artistLabelYPos, artistLabelWidth, artistLabelHeight)]autorelease]; 
      label.text = [thesong.title stringByAppendingString:[@"\nby " stringByAppendingString:thesong.artist]]; 
      [label setTextAlignment:UITextAlignmentLeft]; 
      label.numberOfLines = 0; 
      label.font = [UIFont systemFontOfSize:artistLabelFontSize]; 
      label.textColor = [UIColor whiteColor]; 
      label.backgroundColor = [UIColor darkTextColor]; 
      label.alpha = 0.75; 

      UIButton *playBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
      playBtn.frame = CGRectMake(x+playBtnXPos, y+playBtnYPos, playBtnWidth, playBtnHeight); 
      [playBtn addTarget:self action:@selector(playBtnClicked:) forControlEvents:UIControlEventTouchUpInside]; 
      if(playingButton && streamer){ 
       if(playingButtonTag == i && [streamer isPlaying]){ 
        [playBtn setBackgroundImage:[UIImage imageNamed:pauseBtnimgName] forState:UIControlStateNormal]; 
        playingButton = playBtn; 
       }else [playBtn setBackgroundImage:[UIImage imageNamed:playBtnimgName] forState:UIControlStateNormal]; 
      }else [playBtn setBackgroundImage:[UIImage imageNamed:playBtnimgName] forState:UIControlStateNormal]; 


      playBtn.tag = i; 
      [cell.contentView addSubview:asyncImage]; 
      [cell.contentView addSubview:label]; 
      [cell.contentView addSubview:playBtn]; 
      label = nil; 
      asyncImage = nil; 



      if(curCellNo == 0){ 
       y += estCoverHeight; 
       if(y>=(estCoverHeight*noOfRowsInCell)){ 
        col++; 
        x += estCoverWidth; 
        if(col>=3) 
         y=0; 
        else 
         y=yForFirst; 
       } 
      }else{ 
       col =3; 
       y += estCoverHeight; 
       if(y>=(estCoverHeight*noOfRowsInCell)){ 

        x += estCoverWidth; 
        y=0; 
       } 
      } 

     } 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    cell.contentView.transform = CGAffineTransformMakeRotation(M_PI/2); 
    return cell; 
} 
+0

pouvez-vous poster votre implémentation de la méthode 'tableView: cellForRowAtIndexPath:'? – filipe

Répondre

1

Vous n'effacez pas le contenu de la cellule lorsque vous la réutilisez. Il s'agit de la programmation UITableView 101. S'il vous plaît, il y a des vidéos WWDC, des vidéos Stanford sur iTunesU que vous devriez regarder, des guides de programmation de table en texte si vous préférez, tout ce qui touche à la réutilisation des cellules.

En résumé: Les cellules sont réutilisées pour économiser de la mémoire. Vous réutilisez les anciennes cellules lorsqu'elles disparaissent de l'écran, en allouer de nouvelles si aucune ne peut être réutilisée. Si vous réutilisez des anciennes cellules, vous devez d'abord effacer les sous-vues que vous avez placées dessus. Sur une note de côté, vous voulez probablement une cellule personnalisée où vous faites la majeure partie du travail que vous faites en tableView:cellForRowAtIndexPath:. Je vous suggère fortement de vous pencher là-dessus également.

+0

si je supprime les sous-vues du contenu de la cellule avant d'ajouter les sous-vues son travail bien mais si défiler après avoir cliqué sur le bouton sur son son écrasement ... et sa cellule personnalisée très difficile dans ma situation et im éditer le code dans la requête – rockey

+0

Il n'est jamais difficile d'utiliser une cellule personnalisée, la seule chose difficile est de se dire que c'est facile à faire, parce que c'est le cas. – jer

+0

effectivement ce que je fais, a eu un objet de la chanson avec image et lien pour l'audio. donc j'ai quelques chansons. en mode tableau, j'affiche toutes les images et le bouton sur chaque image.dans chaque cellule, j'imprime 12 images mais dans la première cellule seulement 9. la première image dans la première cellule est double de la taille des autres images. donc si j'utilise la cellule personnalisée, toutes les cellules devraient avoir le même cadre pour le contenu ... c'est le problème ... d'autre part, je peux facilement changer le contenu de la cellule avec le même cadre droit? – rockey

2

Il est parce que vous mettez jamais le contenu du nouveau utilisé

de UITableViewCell

Vous ne fournirez la conetent quand (cellules == nil) et une nouvelle cellule est allouée

1

J'ai fait ce une erreur - une fois que vous le faites et le réparez une fois, vous n'oublierez jamais :)

Les instances de UITableViewCell sont mises en cache pour des raisons de performances. La classe UITableView gère tout cela pour vous. Il met en cache assez d'instances pour couvrir la valeur d'un plein écran de cellules plus un peu. Cela signifie qu'une table de 100 lignes s'écoulera du même nombre d'instances qu'une table de 1000 lignes. Cela signifie que vous avez la responsabilité de mettre à jour le contenu tel qu'il apparaît. (TableEUableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath est appelée lorsqu'une cellule est demandée.

(UITableViewCell *) Dans votre mise en œuvre:

if(cell == nil) { 
    // Instantiate the UITableViewCell here 
    // Perform operations that need to occur on every cell, regardless of content 
} 

// Out here, perform content assignments 

Espérons que cela efface un peu les choses. Vous avez simplement besoin de déplacer la plupart du code qui est à l'intérieur du conditionnel à l'extérieur du conditionnel. Cela dit, je ne tolère pas votre utilisation du code. Vous devriez vraiment implémenter une cellule personnalisée. Il est plus facile que ce que vous faites :)

+0

J'ai une trame différente pour le contenu de la première cellule qui est le problème. si le contenu de toutes les cellules est le même, je peux faire l'assignation de contenu – rockey

0

juste essayer cette

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil]; 

Il a travaillé pour me.I avait un UITableView avec cells.I composé également fait face aux mêmes problèmes.

Questions connexes