2009-08-25 7 views
6

J'ai trouvé quelques messages qui sont similaires à mon problème mais pas tout à fait la même chose.dupliquer des lignes dans tableview sur uitableviewcell

Dans mon application, l'utilisateur peut naviguer entre plusieurs visualisations en vue d'obtenir le résultat souhaité. Lorsqu'un utilisateur avance, recule, avance, etc., il est à noter que les lignes sont redessinées/réécrites et le texte devient plus audacieux et plus audacieux.

J'ai trouvé que dans certains de ces messages cela peut être lié à la façon dont je crée les lignes, en utilisant un uilable dans la méthode cellforrowatindexpath.

Y a-t-il quelque chose que je dois faire pour que les lignes ne soient pas repeuplées/redessinées chaque fois qu'un utilisateur va en avant et en arrière entre les vues de table? Ai-je besoin d'ajouter quelque chose au code ci-dessous ou d'ajouter quelque chose à la méthode viewwillappear (actuellement il y a un 'reloaddata' dans la viewwillappear pour la table mais ne semble pas aider)?

Voici mon code:

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) 
{ 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
} 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

    UILabel *label = [[[UILabel alloc] init] autorelease]; 
    label.font = [UIFont fontWithName:@"Arial-BoldMT" size:20]; 
    label.frame = CGRectMake(10.0f, 10.0f, 220.0f, 22.0f); 
    label.textColor = [UIColor blackColor]; 
    label.backgroundColor = [UIColor clearColor]; 
    label.opaque = NO; 
    label.text = [mapareaArray objectAtIndex:indexPath.row]; 
    [cell.contentView addSubview:label]; 

    CustomCellBackgroundView *bgView = [[CustomCellBackgroundView alloc] initWithFrame:CGRectZero]; 
    bgView.borderColor = [UIColor clearColor]; 
    bgView.fillColor = [UIColor whiteColor]; 
    bgView.position = CustomCellBackgroundViewPositionSingle; 
    cell.backgroundView = bgView; 
    return cell; 
} 

Répondre

11

Le problème que vous rencontrez est dû à cette ligne:

[cell.contentView addSubview:label]; 

Vous ajoutez un sous-vue à la cellule de table, que ce soit une nouvelle cellule ou non . S'il s'agit d'une ancienne cellule (retirée du pool réutilisable), vous ajouterez une autre sous-vue à la cellule. Au lieu de cela, vous devez étiqueter UILabel, puis le localiser avec la balise pour modifier le contenu de ce UILabel. Ajouter (et définir tous ses attributs) et baliser le UILabel dans le cas (cellule == nil) bloc:

if(cell == nil) { 
    // alloc and init the cell view... 

    UILabel *label = [[[UILabel alloc] init] autorelease]; 
    label.tag = kMyTag; // define kMyTag in your header file using #define 
    // and other label customizations 
    [cell.contentView addSubview:label]; // addSubview here and only here 
    ... 
} 

avec Repérez ensuite:

UILabel *label = (UILabel *)[cell.contentView viewWithTag: kMyTag]; 
label.text = [mapareaArray objectAtIndex:indexPath.row]; 

Et pas besoin de rajouter en tant que sous-vue en dehors du bloc if (cell == nil). La sous-vue est déjà là (et c'est pourquoi la réutilisation des vues de cellules est beaucoup plus efficace, si vous le faites correctement, c'est-à-dire;).

+0

Merci beaucoup pour cela. Grande aide. Une dernière question à ce sujet - Je n'ai pas de contexte de programmation, donc je ne sais pas ce que vous voulez dire par l'utilisation de #define dans le fichier d'en-tête. Quelle est la syntaxe pour le faire? Je l'ai déjà vu et j'ai essayé de mettre '#define kMyTag' dans l'en-tête mais ça ne marche pas ...Je suppose que vous avez besoin de définir kMyTag à une valeur, mais je ne sais pas quelle serait la syntaxe pour le faire. Pouvez-vous aider? – SKayser

1

fichier .H Le « définir » est mis après les déclarations #import en haut du fichier d'en-tête, et a été mis à 0 parce que je ne sais pas comment la définir:

#define kMyTag 0 

. m fichier J'ai mis à jour cette section en fonction de vos commentaires, mais a) la table n'est pas remplie, b) lorsque l'utilisateur a accédé à la vue suivante et échoue avec un "sélecteur non reconnu envoyé à l'instance" , et c) j'ai dû mettre dans les deux 'cellule de retour'; entrées ou il tombe. Je pense que j'ai les choses dans le mauvais ordre et peut-être n'ai pas initialisé les choses correctement ????

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

if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 

     UILabel *label = [[[UILabel alloc] init] autorelease]; 
     label.tag = kMyTag; // define kMyTag in your header file using #define 
     label.font = [UIFont fontWithName:@"Arial-BoldMT" size:20]; 
     label.frame = CGRectMake(10.0f, 10.0f, 220.0f, 22.0f); 
     label.textColor = [UIColor blackColor]; 
     label.backgroundColor = [UIColor clearColor]; 
     label.opaque = NO; 

     CustomCellBackgroundView *bgView = [[CustomCellBackgroundView alloc] initWithFrame:CGRectZero]; 
     bgView.borderColor = [UIColor clearColor]; 
     bgView.fillColor = [UIColor whiteColor]; 
     bgView.position = CustomCellBackgroundViewPositionSingle; 
     cell.backgroundView = bgView; 

     [cell.contentView addSubview:label]; // addSubview here and only here 
     return cell; 
    } 
UILabel *label = (UILabel *)[cell.contentView viewWithTag: kMyTag]; 
label.text = [mapareaArray objectAtIndex:indexPath.row]; 
return cell; 
} 
+0

Je ne suis pas sûr si vous devriez utiliser 0 pour la valeur de kMyTag. Essayez à partir de 1, car 0 peut être la valeur par défaut pour tout. Après cette modification, supprimez la cellule de retour dans le bloc if. – tchen

+0

Merci encore une fois! Cela fonctionne maintenant! Appréciez votre temps! – SKayser

0

Vous devez créer une sous-classe pour UITableViewCell pour cette cellule spécifique, puis appliquer la logique pour voir si vous avez besoin d'ajouter le sous-vue à lui-même à chaque fois. En outre, utilisez prepareForReuse de UITableviewcell et supprimez toutes les sous-vues pendant cette période avant d'appliquer la logique de l'ajout d'un UILabel à votre cellule.

Questions connexes