2013-06-28 10 views
5

Sto usando un'etichetta sulla cella tableview. Alla cella è stata assegnata una stringa attribuita, ma il problema è che alla selezione il testo della cella non diventa bianco per la stringa attribuita.Imposta il colore del testo evidenziato per UILabel usando NSAttributedString.?

C'è un modo per risolverlo ..?

Qualsiasi aiuto è apprezzato.

Ecco uno sguardo al mio codice.

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

    LHSearchViewCell *cell = [LHSearchViewCell cellForTableView:tableView fromNib:_cellNib]; 

    cell.selectionStyle = UITableViewCellSelectionStyleGray; 

    cell.headerLabel.textColor = [UIColor darkGrayColor]; 
    cell.headerLabel.highlightedTextColor = [UIColor whiteColor]; 
    cell.headerLabel.font = [UIFont systemFontOfSize:14]; 

    cell.subLabel.font = [UIFont systemFontOfSize:12]; 
    cell.subLabel.textColor = [UIColor darkGrayColor]; 
    cell.subLabel.numberOfLines = 2; 
    switch (indexPath.section) { 
     case 0: 
     { 
      UIFont *font = [UIFont systemFontOfSize:14.0]; 
      NSDictionary *firstAttributes = [NSDictionary dictionaryWithObjectsAndKeys:font,NSFontAttributeName,[UIColor darkGrayColor],NSForegroundColorAttributeName,nil]; 
      UIFont *secondFont = [UIFont systemFontOfSize:10.0]; 
      NSDictionary *secondAttributes = [NSDictionary dictionaryWithObjectsAndKeys:secondFont,NSFontAttributeName,[UIColor lightGrayColor],NSForegroundColorAttributeName,nil]; 
      NSString* completeString = [NSString stringWithFormat:@"%@ | %@",[_libraryPdfArray objectAtIndex:indexPath.row],[_libraryPdfDateArray objectAtIndex:indexPath.row]]; 
      NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]  initWithString:completeString]; 
      [attributedString setAttributes:firstAttributes range:[completeString rangeOfString:[_libraryPdfArray objectAtIndex:indexPath.row]]]; 
      [attributedString setAttributes:secondAttributes range:[completeString rangeOfString:[_libraryPdfDateArray objectAtIndex:indexPath.row]]];    
      cell.headerLabel.attributedText = attributedString; 

      cell.subLabel.text = [_libraryPdfSubtitleArray objectAtIndex:indexPath.row]; 

     } 
      break; 

     case 1: 
     { 
      UIFont *font = [UIFont systemFontOfSize:14.0]; 
      NSDictionary *firstAttributes = [NSDictionary dictionaryWithObjectsAndKeys:font,NSFontAttributeName,[UIColor darkGrayColor],NSForegroundColorAttributeName,nil]; 
      NSString* completeString = [NSString stringWithFormat:@"%@ | %@",[_ebriefingPdfArray objectAtIndex:indexPath.row],[_ebriefingSecondLabelTextArray objectAtIndex:indexPath.row]]; 
      NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]  initWithString:completeString]; 
      [attributedString setAttributes:firstAttributes range:[completeString rangeOfString:[_ebriefingPdfArray objectAtIndex:indexPath.row]]]; 
      [attributedString setAttributes:firstAttributes range:[completeString rangeOfString:[_ebriefingSubtitleArray objectAtIndex:indexPath.row]]]; 
      cell.headerLabel.attributedText = attributedString; 
      cell.subLabel.text = [_ebriefingSubtitleArray objectAtIndex:indexPath.row]; 
     } 
      break; 

     default: 
      break; 
    } 

    return cell; 
} 
+0

Si prega di aggiungere un commento per il motivo per cui avete votato in giù. –

+0

La mia ipotesi è che non otterreste voti negativi se ci mostrate cosa avete fatto finora. –

+0

@AnkitSrivastava vedere la mia risposta da questo link http://stackoverflow.com/questions/14068962/how-to-use-multiple-font-stylings-on-a-single-string-inside-a-label/14068992#14068992 :) –

risposta

2

Io ho la soluzione.

In classe cellulare, possiamo ingresso stringhe attribuito come di seguito

- (void) formatText:(BOOL)isSelected{ 
    UIFont *font = [UIFont systemFontOfSize:14.0]; 
    UIFont *secondFont = [UIFont systemFontOfSize:10.0]; 

    NSMutableDictionary *firstAttributes; 
    NSMutableDictionary *secondAttributes; 

    NSDictionary *firstAttributeFont = @{NSFontAttributeName:font}; 
    NSDictionary *secondAttributeFont = @{NSFontAttributeName:secondFont}; 

    [firstAttributes addEntriesFromDictionary:firstAttributeFont]; 
    [secondAttributes addEntriesFromDictionary:secondAttributeFont]; 

    if (!isSelected) { 
     [firstAttributes addEntriesFromDictionary:@{NSForegroundColorAttributeName:[UIColor darkGrayColor]}]; 
     [secondAttributes addEntriesFromDictionary:@{NSForegroundColorAttributeName:[UIColor lightGrayColor]}]; 

    } 
    else{ 
     [firstAttributes addEntriesFromDictionary:@{NSForegroundColorAttributeName:[UIColor whiteColor]}]; 
     [secondAttributes addEntriesFromDictionary:@{NSForegroundColorAttributeName:[UIColor colorWithWhite:1.0 alpha:4.0]}]; 
    } 


    NSString* completeString = [NSString stringWithFormat:@"%@ %@",self.firstAttributeText,self.secondAttributeText]; 
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]  initWithString:completeString]; 
    [attributedString setAttributes:firstAttributes range:[completeString rangeOfString:self.firstAttributeText]]; 
    [attributedString setAttributes:secondAttributes range:[completeString rangeOfString:self.secondAttributeText]]; 
    self.headerLabel.attributedText = attributedString; 
} 

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

    [super setSelected:selected animated:animated]; 
    [self formatText:selected]; 
    // Configure the view for the selected state 

} 

-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated{ 

    [super setHighlighted:highlighted animated:animated]; 
    [self formatText:highlighted]; 

} 
5

cercano di usare questo uno

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
     { 

     UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

     UILabel *label = (UILabel *)[cell viewWithTag:yourTag]; 

     NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:label.text]; 

[str addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(10,10)]; 

     label.attributedText = str 
     } 
+0

Questa è una soluzione alternativa con opzioni su willSelect e willDeselect cell, ma sto cercando di trovare una soluzione migliore evitando l'uso di modifiche al testo nel controller invece che nella classe della cella. –

+1

Si dovrebbe fare "label.attributedText = str" e non semplicemente "label.text = str" – superpuccio

+0

@superpuccio Grazie cambiato .... –

-1

È possibile utilizzare la classe RTLabel lo farà molto utile. Scaricalo da qui RTLabel

+0

Sì, consentiamoci di risolverlo con una libreria di terze parti ... – TheCodingArt

2

soluzione UILabel sottoclasse

@implementation CustomLabelHighlighted { 
    NSAttributedString *savedAttributedString; 
} 

-(void)setHighlighted:(BOOL)highlighted { 
    if(!SYSTEM_VERSION_LESS_THAN(@"6.0")){ 
     if(highlighted){ 
      if(!self.attributedText){ 
       return; 
      } 

      NSMutableAttributedString *highAttributedString = [self.attributedText mutableCopy]; 
[highAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:(NSRange){0, [highAttributedString.string length]}]; 

      // important! 
      [super setAttributedText:highAttributedString]; 
     } 
     else{ 
      if(savedAttributedString){ 
       self.attributedText = savedAttributedString; 
      } 
     } 
    } else { 
     [super setHighlighted:highlighted]; 
    } 
} 

- (void)setAttributedText:(NSAttributedString *)attributedText { 
    [super setAttributedText:attributedText]; 
    savedAttributedString = attributedText; 
} 

@end