ios objective-c nsstring nsrange

ios - ¿Cómo obtener todo el NSRange de un personaje en particular en una NSString?



objective-c (4)

Tengo dos NSStrings: orgText y searchLetter .
Quiero resaltar todas las apariciones de searchLetter en orgText con un color rojo.
¿Cómo puedo obtener el NSRange de todas las apariciones de la searchLetter ?
por ejemplo:

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

Quiero resaltar todas las apariciones "a" en "abcahaiapaoiuiapplma" con color rojo.
Gracias.


Bloqueo de código en "setTextColor" para MutableAttributeString

en lugar de usar código debajo

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


Escribí este método para mi proyecto - SUITextView con resaltado :

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


Esta es una forma 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"]];


No veo ninguna solución con expresiones regulares, por lo que he creado una elegante, 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; } }