2012-06-26 5 views
0

J'essayais d'implémenter un UILabel dans une cellule et ce que j'obtiens est un chevauchement de certaines valeurs lorsque je fais défiler la table plusieurs fois. Je travaille avec ARC donc il n'y a pas de version quand je veux, alors ma question est: Quelle est la bonne façon d'implémenter un Label dans une cellule tableView?UILabel dans Table View - dans le bon sens?

Here is how it looks

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


    } 
    // Configure the cell... 

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    cell.textLabel.textColor = [UIColor colorWithRed:0.6 green:0.6 blue:0.6 alpha:1]; 
    cell.textLabel.highlightedTextColor = [UIColor colorWithRed:0.753 green:0.651 blue:0.1569 alpha:1]; 


    UILabel *cellLabelS1 = [[UILabel alloc] initWithFrame:CGRectMake(250, 0, cell.frame.size.width, cell.frame.size.height)]; 
    cellLabelS1.backgroundColor = [UIColor clearColor]; 
    cellLabelS1.font = [UIFont boldSystemFontOfSize:16]; 
    [cellLabelS1 setTextColor:[UIColor whiteColor]]; 


    [cellLabelS1 setText:temperatureString]; 
    temperatureString = nil; 
    [cell addSubview:cellLabelS1]; 
    [[cell imageView]setImage:[UIImage imageNamed:imageFromCodeDay1]]; 
    [[cell textLabel]setText:cityString]; 

    return cell; 

}

+1

Le * meilleur * moyen serait de créer une coutume 'UITableViewCell' avec Interface Builder. –

Répondre

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

     UILabel *cellLabelS1 = [[UILabel alloc] initWithFrame:CGRectMake(250, 0,cell.frame.size.width, cell.frame.size.height)]; 
cellLabelS1.backgroundColor = [UIColor clearColor]; 
cellLabelS1.tag = 200; 
cellLabelS1.font = [UIFont boldSystemFontOfSize:16]; 
[cellLabelS1 setTextColor:[UIColor whiteColor]]; 
[cell addSubview:cellLabelS1]; 
} 
// Configure the cell... 

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
cell.textLabel.textColor = [UIColor colorWithRed:0.6 green:0.6 blue:0.6 alpha:1]; 
cell.textLabel.highlightedTextColor = [UIColor colorWithRed:0.753 green:0.651 blue:0.1569 alpha:1]; 

UILabel *cellLabelS1 = (UILabel*)[cell viewWithTag:200]; 
[cellLabelS1 setText:temperatureString]; 
temperatureString = nil; 

[[cell imageView]setImage:[UIImage imageNamed:imageFromCodeDay1]]; 
[[cell textLabel]setText:cityString]; 

return cell; 
} 

peut que cela vous aidera ....

2

Vous devez ajouter une étiquette à la cellule que si vous n'avez pas one.If vous réutilisez les cellules sur la deuxième passe, vous l'ajoutez à nouveau. Donc, mon conseil est de mettre une étiquette sur l'étiquette et d'essayer de voir si le contenu de la cellule est déjà affiché sur l'étiquette. Si ce n'est pas le cas, créez et ajoutez-le.

  UILabel *myLabel = (UILabel *)[cell.contentView viewWithTag:2002]; 
      if(!myLabel){ 
       myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 22)]; 
       myLabel.tag = 2002; 
       [cell.contentView addSubview:myLabel]; 
      } 
      myLabel.text = @"my new text"; 
+0

Huh, je ne savais pas que vous pourriez obtenir des sous-vues par balise facilement, cela rend la recherche de l'étiquette que vous avez précédemment créé beaucoup plus facile que je pensais que ce serait –

0

Votre problème est dans ces lignes:

UILabel *cellLabelS1 = [[UILabel alloc] initWithFrame:CGRectMake(250, 0, cell.frame.size.width, cell.frame.size.height)]; 
cellLabelS1.backgroundColor = [UIColor clearColor]; 
cellLabelS1.font = [UIFont boldSystemFontOfSize:16]; 
[cellLabelS1 setTextColor:[UIColor whiteColor]]; 

Lorsque vous obtenez une cellule arrière réutilisée de la vue de la table, il a déjà Hass cette étiquette en elle. Ce que vous pouvez faire pour éviter d'ajouter des étiquettes en double, c'est de l'ajouter seulement si vous avez besoin d'allouer une nouvelle cellule. Cependant, cela peut rendre la récupération de l'étiquette à partir d'une cellule réutilisée assez compliquée.

Je suggère personnellement de créer un UITableViewCell personnalisé dans le générateur d'interface, et de créer une sous-classe UITableViewCell personnalisée qui a une propriété UILabel.

+0

pour obtenir l'étiquette de l'ancienne cellule n'est pas compliquée du tout . Et si vous voulez avoir une sous-classe de cellule personnalisée UITableViewCell et implémenter drawContentView et dessiner tout à la main si vous avez besoin de vitesse de défilement. –

Questions connexes