2011-12-16 65 views
19

我有兩個NSString:orgTextsearchLetter
我想用紅色突出顯示orgText中searchLetter的每一次出現。
如何獲得searchLetter的所有匹配項的NSRange
爲如:如何獲取NSString中特定字符的所有NSRange?

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

我想hightlight所有 「A」 出現在 「abcahaiapaoiuiapplma」 與紅色。
謝謝。

回答

55

我寫這個方法爲我的項目 - 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; 
} 

在我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

完美也於2012年:) – NDY 2012-10-31 09:56:50

+0

更簡單的方法,我認爲有一個額外的「}」左右浮動,但在'14 – dacopenhagen 2014-08-25 23:46:56

2

代碼墜毀在 「setTextColor」 爲MutableAttributeString

,而不是它使用以下代碼

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

我沒有看到任何使用正則表達式的解決方案,所以我創建了一個優雅的解決方案,可能對未來的某個人有用。

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

這是做

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