2011-12-16 8 views
19

Tengo dos NSStrings: orgText y searchLetter.
Quiero resaltar todas las apariciones de la letra de búsqueda en el orgText con un color rojo.
¿Cómo puedo obtener el NSRange de todas las ocurrencias del searchLetter?
por ejemplo:¿Cómo obtener todos los NSRange de un personaje en particular en un NSString?

suppose: orgText = "abcahaiapaoiuiapplma" 
     searchLetter = "a". 

Quiero hightlight todos "a" apariciones en "abcahaiapaoiuiapplma" con el rojo.
Gracias.

Respuesta

55

escribí este método para mi proyecto - SUITextView with highlight:

- (NSMutableAttributedString*) setColor:(UIColor*)color word:(NSString*)word inText:(NSMutableAttributedString*)mutableAttributedString { 

    NSUInteger count = 0, length = [mutableAttributedString length]; 
    NSRange range = NSMakeRange(0, length); 

    while(range.location != NSNotFound) 
    { 
     range = [[mutableAttributedString string] rangeOfString:word options:0 range:range]; 
     if(range.location != NSNotFound) { 
      [mutableAttributedString setTextColor:color range:NSMakeRange(range.location, [word length])]; 
      range = NSMakeRange(range.location + range.length, length - (range.location + range.length)); 
      count++; 
     } 
    } 

    return mutableAttributedString; 
} 

Y en mi categoría de NSMutableAttributedString:

- (void) setTextColor:(UIColor*)color range:(NSRange)range { 
    // kCTForegroundColorAttributeName 
    [self removeAttribute:(NSString*)kCTForegroundColorAttributeName range:range]; // Work around for Apple leak 
    [self addAttribute:(NSString*)kCTForegroundColorAttributeName value:(id)color.CGColor range:range]; 
} 
+0

perfecto también en 2012 :) – NDY

+0

Creo que hay un extra "}" flotando alrededor, pero trabajando todavía en gran '14 – dacopenhagen

+0

@dacopenhagen se tienen razón. ese método fue escrito para múltiples palabras :) – SAKrisT

2

accidente Código al "SetTextColor" para MutableAttributeString

en vez de él use debajo del código

NSDictionary *tempdict=[NSDictionary dictionaryWithObjectsAndKeys:[UIFont boldSystemFontOfSize:12.0],NSFontAttributeName,color,NSForegroundColorAttributeName, nil]; 
[mutableAttributedString setAttributes:tempdict range:NSMakeRange(range.location, [word length])]; 
6

No veo ninguna solución con expresión regular, así que he creado una elegante, que puede ser útil para alguien en el futuro.

- (BOOL)highlightString:(NSString *)string inText:(NSMutableAttributedString *)attributedString withColour:(UIColor *)color { 
    NSError *_error; 
    NSRegularExpression *_regexp = [NSRegularExpression regularExpressionWithPattern:string options:NSRegularExpressionCaseInsensitive error:&_error]; 
    if (_error == nil) { 
     [_regexp enumerateMatchesInString:attributedString.string options:NSMatchingReportProgress range:NSMakeRange(0, attributedString.string.length) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { 
      if (result.numberOfRanges > 0) { 
       for (int i = 0; i < result.numberOfRanges; i++) { 
        [attributedString addAttribute:NSBackgroundColorAttributeName value:color range:[result rangeAtIndex:i]]; 
       } 
      } 
     }]; 
     return TRUE; 
    } else { 
     return FALSE; 
    } 
} 
-1

esta es una manera más fácil de hacerlo

NSString *str = @"hello world"; 
NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:str]; 
[attr addAttributes:@{NSForegroundColorAttributeName : [UIColor redColor]} 
       range:[str rangeOfString:@"world"]]; 
+0

NOTA: esto solo agregaría atributos a la primera aparición de subcadena –

Cuestiones relacionadas