2010-05-19 8 views
4

J'ai une cellule personnalisée et lorsque l'utilisateur sélectionne cette cellule, j'aimerais que le texte des deux UILabels devienne gris clair.Changer la couleur du texte dans la personnalisation UITableViewCell iphone

ChecklistCell.h:

#import <UIKit/UIKit.h> 


@interface ChecklistCell : UITableViewCell { 
    UILabel *nameLabel; 
    UILabel *colorLabel; 
    BOOL selected; 


} 

@property (nonatomic, retain) IBOutlet UILabel *nameLabel; 
@property (nonatomic, retain) IBOutlet UILabel *colorLabel; 



@end 

ChecklistCell.m:

#import "ChecklistCell.h" 


@implementation ChecklistCell 
@synthesize colorLabel,nameLabel; 
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
    if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) { 
     // Initialization code 
    } 
    return self; 
} 


- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 

    [super setSelected:selected animated:animated]; 

    // Configure the view for the selected state 
} 


- (void)dealloc { 
    [nameLabel release]; 
    [colorLabel release]; 
     [super dealloc]; 
} 


@end 

Répondre

5

Dans votre méthode didSelectRowAtIndexPath, faire un appel pour obtenir la cellule en cours et mettre à jour en conséquence:

CheckListCell* theCell = (CheckListCell*)[tableView cellForRowAtIndexPath:indexPath]; 
theCell.nameLabel.textColor = [UIColor lightGrayColor]; 
theCell.colorLabel.textColor = [UIColor lightGrayColor]; 
+0

Cela fonctionne parfaitement, sauf lorsque je fais défiler les cellules modifiées, puis que je reviens en arrière, la cellule est de retour à son état d'origine. Donc, je suppose que je dois garder une trace des cellules qui sont modifiées ailleurs? Im devinant de conserver un tableau de indexPaths qui ont été modifiés, puis dans la méthode cellForRowAtIndexPath l'a vérifié le tableau pour ce chemin d'index? Ou y a-t-il un autre moyen? – Brodie

+0

et bien sûr, maintenant que j'essaie de le faire, je ne peux pas comparer facilement deux indexPaths ... – Brodie

+0

Oui, vous devriez vraiment mettre à jour votre source de données en même temps. Ce que j'ai décrit est vraiment seulement pour obtenir la mise à jour visuelle instantanée. Je suppose que vous avez un tableau d'objets que vous utilisez comme source de données pour la table?Vous pouvez ajouter une propriété à l'objet pour définir s'il est sélectionné ou non, la mettre à jour dans la méthode didSelectRowAtIndexPath (ainsi que le code ci-dessus) et l'utiliser pour déterminer textColor dans la méthode cellForRowAtIndexPath. J'espère que c'est clair! –

0

Dans tableView:didSelectRowAtIndexPath: fiche du chemin d'index d'une cellule sélectionnée. Dans tableView:cellForRowAtIndexPath: il suffit de vérifier si elle correspond à votre chemin d'index enregistré, et définir la couleur du texte en conséquence. Je ne suis pas complètement sûr si la cellule est redessinée après une sélection, donc vous devrez peut-être reloadData sélection suivante, mais il devrait être assez rapide si vous mettez en cache des cellules/suivant les meilleures pratiques de dessin de cellules normales. Ou utiliser reloadRowsAtIndexPaths:withRowAnimation avec UITableViewRowAnimationNone. Mais vous devrez alors garder la trace de la dernière cellule que vous avez dessinée en texte gris et la redessiner dans un style simple également.

0

La façon dont je triai c'était « didSelectRowAtIndexPath: » boucle à travers tous les sous-vues de tableView et mettre tout le texte étiquettes à la couleur par défaut comme ceci:

for(CustomTableViewCell *tableCell in [tableView subviews]) { 
    if([tableCell isKindOfClass:[UITableViewCell class]]) { 
     [tableCell.textLabel setTextColor: [UIColor blackColor]]; 
    } 
} 

.... puis réglez la cellule de tableau sélectionnée sur blanc.

[[tableView cellForRowAtIndexPath:indexPath].textLabel setTextColor: [UIColor whiteColor]]; 
+0

Comme vous pouvez le voir lors de la boucle j'ai vérifié pour voir si la sous-vue était un peu UITableViewCell et seulement changé la couleur si elle était. J'espère que cela t'aides! – jodm

13

Puisque vous utilisez une cellule de tableau personnalisé, vous pouvez mettre en œuvre le code pour définir les couleurs de l'étiquette en mettant en œuvre les méthodes et setSelected setHighlighted dans votre UITableViewCell personnalisé. Cela capturera tous les changements d'état de la sélection, bien qu'il y ait quelques cas difficiles, comme lorsque setHighlighting est appelé avec NO lorsque vous sélectionnez et faites glisser hors de la cellule après qu'elle a déjà été sélectionnée. Voici l'approche que j'ai utilisée, qui, je crois, définit la couleur de façon appropriée dans tous les cas.

- (void)updateCellDisplay { 
    if (self.selected || self.highlighted) { 
     self.nameLabel.textColor = [UIColor lightGrayColor]; 
     self.colorLabel.textColor = [UIColor lightGrayColor]; 
    } 
    else { 
     self.nameLabel.textColor = [UIColor blackColor]; 
     self.colorLabel.textColor = [UIColor blackColor]; 
    } 
} 

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    [super setHighlighted:highlighted animated:animated]; 
    [self updateCellDisplay]; 
} 

- (void) setSelected:(BOOL)selected animated:(BOOL)animated { 
    [super setSelected:selected animated:animated]; 
    [self updateCellDisplay]; 
} 
0

Il est très simple, il vous suffit d'utiliser (ci-dessous) méthode, ici, je suis la mise en couleur des cellules alternative

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row%2 == 0) 
    { 
     tCell.cellLabel.textColor = [UIColor grayColor]; 
    } 
    else 
    { 
     tCell.cellLabel.textColor = [UIColor blackColor]; 
    } 
} 

PS- pas besoin d'utiliser cellForRowAtIndexPath: méthode pour changer cellText Propties ..

Questions connexes