How to get all NSRange of a particular character in a NSString?

后端 未结 4 1861
醉酒成梦
醉酒成梦 2020-12-10 11:21

I have two NSStrings: orgText and searchLetter.
I want to highlight every occurrences of the searchLetter in the orgText with a re

相关标签:
4条回答
  • 2020-12-10 11:54

    I wrote this method for my project - 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;
    }
    

    And in my category of 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 讨论(0)
  • 2020-12-10 12:03

    I'm not seeing any solution with regular expression, so I've created an elegant one, it may be useful for someone in the future.

    - (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;
        }
    }
    
    0 讨论(0)
  • 2020-12-10 12:03

    Code crash at "setTextColor" for MutableAttributeString

    instead of it use below code

    NSDictionary *tempdict=[NSDictionary dictionaryWithObjectsAndKeys:[UIFont boldSystemFontOfSize:12.0],NSFontAttributeName,color,NSForegroundColorAttributeName, nil];
    [mutableAttributedString setAttributes:tempdict range:NSMakeRange(range.location, [word length])];
    
    0 讨论(0)
  • 2020-12-10 12:08

    this is an easier way of doing it

    NSString *str = @"hello world";
    NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:str];
    [attr addAttributes:@{NSForegroundColorAttributeName : [UIColor redColor]} 
                  range:[str rangeOfString:@"world"]];
    
    0 讨论(0)
提交回复
热议问题