2008-10-21 10 views
11

Un UITableViewCell vient « pré-construit » avec un UILabel comme seul et unique sous-vue après avoir init'ed il. Je serais vraiment aiment changer la couleur de fond de ladite étiquette, mais peu importe ce que je fais la couleur ne change pas. Le code en question:Changer la couleur de fond d'un UILabel dans un UITableViewCell

UILabel* label = (UILabel*)[cell.contentView.subviews objectAtIndex:0]; 
label.textColor = [UIColor whiteColor]; 
label.backgroundColor = [UIColor darkGrayColor]; 
label.opaque = YES; 

Répondre

8

Votre extrait de code fonctionne bien pour moi, mais cela doit être fait après que la cellule a été ajoutée à la table et montré, je crois. Si elle est appelée à partir du initWithFrame:reuseIdentifier:, vous obtiendrez une exception, comme le UILabel n'a pas sous-vue encore été créé.

Probablement la meilleure solution est d'ajouter votre propre UILabel, configuré selon vos normes, plutôt que de compter sur ce chemin (très branlant) à celui intégré.

+0

Eh bien, la raison pour laquelle je demande en premier lieu parce que je veux compter sur le chemin branlante, à savoir: Je ne veux pas avoir à créer mon propre sous-vue (yup, je suis que paresseux). Vous dites que mon code fonctionne pour vous en ce sens qu'il change la couleur de fond? Pouvez-vous être plus précis sur la façon dont vous l'avez fait fonctionner? – rpj

+0

Je suis paresseux aussi, mais c'est dangereux ;-) J'ai ajouté un appel différé dans la méthode init de ma cellule qui a appelé votre code. Il a changé la couleur de fond (et la couleur du texte, bien sûr). –

2

Ajoutez votre propre étiquette au contentView lorsque vous allouez la cellule, plutôt que de compter sur l'extraction de la construction dans un. Ensuite, vous pouvez contrôler toutes les valeurs:

UILabel* label = [[[UILabel alloc] init] autorelease]; 
label.textColor = [UIColor whiteColor]; 
label.backgroundColor = [UIColor darkGrayColor]; 
label.opaque = YES; 
[cell.contentView addSubview:label]; 
+0

Cela ne semble pas fonctionner du tout, du moins pas depuis tableView: cellForRowAtIndexPath: où j'essaie de faire fonctionner les choses. Des indices? – rpj

5

Cela ne fonctionne pas parce que le UITableViewCell fixe ses backgroundColors d'étiquettes dans la méthode layoutSubviews.

Si vous souhaitez modifier la couleur de l'élément textLabel intégré ou detailTextLabel, sous-classez UITableViewCell et remplacez layoutSubviews. Appelez l'implémentation super, ALORS modifiez la propriété backgroundColor à ce que vous voulez.

- (void) layoutSubviews 
{ 
    [super layoutSubviews]; 

    self.textLabel.backgroundColor = [UIColor redColor]; 
} 
0
for (UIView *views in views.subviews) 
{ 
    UILabel* temp = (UILabel*)[views.subviews objectAtIndex:0]; 
    temp.textColor = [UIColor whiteColor];   
    temp.shadowColor = [UIColor blackColor]; 
    temp.shadowOffset = CGSizeMake(0.0f, -1.0f); 
}