2010-01-08 3 views
2

Il y a 5 cellules et chaque cellule a une étiquette dynamique. la hauteur de la cellule est définie par le contenu de l'étiquette en utilisant la méthode heightForRowAtIndexPath. Maintenant, 3 cellules sont affichées. Quand je défile pour les cellules suivantes, cellForRowAtIndexPath est appelé une fois et dans la sortie, une cellule (4 OR 5) est affichée correctement mais une autre a le contenu de la 1ère cellule (répétition). Y at-il une solution pour résoudre ce problème? La méthode cellForRowAtIndexPath doit être appelée 2 fois. J'ai défini correctement les sections et les lignes.Répéter Problème de la cellule tableview pendant le défilement dans l'iphone

+0

Vous ne réutilisez probablement pas les cellules correctement. Veuillez fournir un échantillon de votre code 'cellForRowAtIndexPath'. –

+0

Salut Brij, La meilleure chose à faire dans ce cas est d'utiliser le concept de réutilisation tel qu'il est défini. Vous pouvez réutiliser, tout le temps vous avez besoin d'un cellView qui correspond à celui qui est nécessaire. Dans la réponse que vous avez donnée comme correcte, vous ne ferez jamais cela. Sur ma réponse, je donne une approche qui peut être utilisée pour éviter de créer une nouvelle cellule pour chaque ligne, mais pour créer un identifiant pour chaque type de cellule.Ok, dans le pire des cas, cela créerait un cellView pour chaque ligne, mais en moyenne, vous aurez une meilleure performance que de créer de nouvelles vues à chaque fois. – vfn

+0

La même vue de table est utilisée plusieurs fois avec des données différentes sur un bouton différent. Les données sont différentes. J'utilise tableview comme un modèle, c'est pourquoi j'ai besoin de recréer la cellule à chaque fois. – Brij

Répondre

1

Vous ne réutilisez probablement pas les cellules correctement. Lorsque vous faites défiler, une cellule précédente est réutilisée par le UITableView, mais vous ne modifiez pas son contenu correctement.

Le code cellForRowAtIndexPath devrait ressembler à ceci:

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

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

    cell.textLabel.text = [self.dataArray objectAtIndex:indexPath.row]; 
    cell.detailTextLabel.text = [self.dateFormatter stringFromDate:[NSDate date]]; 

    return cell; 
} 

Est-ce que votre look comme ça?

+0

Oui, j'ajoute l'étiquette selon indexPath en utilisant l'instruction switch. – Brij

+0

Pourriez-vous poster votre 'cellForRowAtIndexPath'? –

0

Comme vous ne disposez pas d'une taille fixe pour chaque ligne, vous ne serez pas en mesure de les réutiliser, à l'exception de présenter à nouveau le même contenu ou un contenu similaire.

Ma suggestion est de créer un identificateur pour chaque ligne de taille différente.

Vous avez dit que vous avez un bouton pour ajouter le contenu en fonction de la indexPath, vous devez donc dequeue les cellules réutilisables dans chaque déclaration de cas, en fonction de sa taille.

-6

Le problème est que la cellule n'est pas Nill il retourne même cellule plusieurs fois pendant le défilement. J'ai supprimé la condition de la méthode cellForRowAtIndexPath.

if (cell == nil) 

Maintenant, chaque fois, il alloue la cellule et fonctionne bien.

+4

S'il vous plaît gardez à l'esprit que (performance-sage) c'est ** le pire que vous auriez pu faire **. –

+0

La même vue de table est utilisée plusieurs fois avec des données différentes sur un bouton différent. Faites-moi savoir ce qui devrait être fait dans ce cas au lieu d'appeler viewcontroller plusieurs fois. – Brij

3

Retirez le jugement

si (cellule == nil)

C'est good.I résoudre mon problème now.Thank beaucoup.

+0

Grâce à cela, j'ai également résoudre mon problème merci @Soul !!! :) –

0

Ne retirez jamais if(cell == nil).

Effacez à la place les sous-vues que vous avez ajoutées sur la cellule.

if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ; 
     }else{ 
     NSArray *cellSubviews= [cell.contentView cellSubviews]; 
     for (UIView * view in subviews) { 
      [view removeFromSuperview]; 
     } 
    } 
0
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *CellIdentifier = [NSString stringWithFormat:@"cell %d",indexPath.row]; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

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

     cell.textLabel.text = @"Hello"; 

    } 
    // Configure the cell. 
    return cell; 
} 
0

essayer de donner un identifiant unique pour chaque cellule,

NSString * CellIdentifier = [NSString stringWithFormat: "Cell% d", indexpath.row];

ne sais pas si cela est la bonne voie, mais il faut résoudre ur problème.

Questions connexes