2011-12-16 9 views
19

Mam dwa NSStrings: orgText i searchLetter.
Chcę wyróżnić każde wystąpienie wyszukiwaniaLetter w orgText czerwonym kolorem.
Jak mogę uzyskać NSRange wszystkich wystąpień searchLetter?
dla np:Jak uzyskać wszystkie NSRange poszczególnych znaków w NSString?

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

Chcę hightlight wszystkie wystąpienia "A" w "abcahaiapaoiuiapplma" czerwono.
Dzięki.

Odpowiedz

55

Napisałem tę metodę dla mojego projektu - 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; 
} 

A w mojej kategorii 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

Idealny również w 2012 roku :) – NDY

+0

Myślę, że dodatkowy „}” pływających wokół, ale nadal działa świetnie w '14 – dacopenhagen

+0

@dacopenhagen cię mają rację. ta metoda została napisana dla wielu słów :) – SAKrisT

2

krach kod na "SetTextColor" dla MutableAttributeString

zamiast niego użyj poniższego kodu:

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

Nie widzę żadnego rozwiązania z wyrażeniem regularnym, dlatego stworzyłem elegancki, może być przydatny dla kogoś w przyszłości.

- (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

to łatwiejszy sposób to zrobić

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

UWAGA: spowoduje to dodanie atrybutów tylko do wystąpienia pierwszego podciągu –

Powiązane problemy