Search code examples
iosobjective-ccocoa-touchuitextviewnsattributedstring

Change Colour of Small Words ('in') in UITextView using NSMutableAttributedString


I'm using NSMutableAttributedString to change the text in a UITextView as the user types. When the user types '#HELLO#' or "#TEST#" or '#test#', those strings should be red (just an example).

- (void)textViewDidChange:(UITextView *)textView
{    
    NSString *textViewText = textView.text;
    NSMutableAttributedString * string = [[NSMutableAttributedString alloc]initWithString:textViewText];

    NSString *space = @" ";
    NSArray *words =[textView.text componentsSeparatedByString:space];

    for (NSString *word in words) {

        if ([word isEqualToString:@"#HELLO#"] || [word isEqualToString:@"#TEST#"] || [word isEqualToString:@"#test#"]) {
            NSRange range=[textView.text rangeOfString:word];
            [string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range];
        }
        else{

            NSRange range=[textView.text rangeOfString:word];
                [string addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:range];

        }
    }

    [string addAttribute:NSFontAttributeName
                   value:[UIFont fontWithName:@"HelveticaNeue-Light" size:20.0]
                   range:NSMakeRange(0, [textView.text length])];

    [textView setAttributedText:string];
}

This works for almost every word, except 'in'. When I type that, 'in' is black rather than white ([UIColor whiteColor]). If I type 't', the 't' in "#test#' turns white.

I'm really confused, can somebody help me out? I thought the else part should catch these strings. Thanks.


Solution

  • I tried your code. I guess the issue is the range you are setting . Because it is always one word it sets color attribute of the first occurrence of that particular word . Whether it be #HELLO# or in . Try typing a particular string repeatedly separated by space you will always get the same output. I have made a few changes in your code and you can see it below . Try it out.

      - (void)textViewDidChange:(UITextView *)textView
        {
            NSString *textViewText = textView.text;
            NSLog(@"Text view Text %@" , textViewText );
            NSMutableAttributedString * string = [[NSMutableAttributedString alloc]initWithString:textViewText];
    
            NSString *space = @" ";
            NSArray *words =[textView.text componentsSeparatedByString:space];
    
            for(NSString *word in words){
    
                NSLog(@"WORD %@" , word);
                if ([word isEqualToString:@"#HELLO#"] || [word isEqualToString:@"#TEST#"] || [word isEqualToString:@"#test#"]) {
    
    
                    NSRange range = NSMakeRange(0, string.length);
                    while(range.location != NSNotFound)
                    {
                        range = [[string string] rangeOfString:word options:0 range:range];
                        if(range.location != NSNotFound)
                        {
    
                            [string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(range.location, word.length)];
                            range = NSMakeRange(range.location + range.length, string.length - (range.location + range.length));
    
                        }
    
                    }
    
    
    
                }
                else{
    
    
                    NSRange range = NSMakeRange(0,string.length);
                    while(range.location != NSNotFound)
                    {
                        range = [[string string] rangeOfString:word options:0 range:range];
                        if(range.location != NSNotFound)
                        {
    
                            [string addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:range];
    
                            range = NSMakeRange(range.location + range.length, string.length - (range.location + range.length));
    
    
    
                        }
    
                    }
    
    
    
    
                }
            }
    
    [string addAttribute:NSFontAttributeName
                       value:[UIFont fontWithName:@"HelveticaNeue-Light" size:20.0]
                       range:NSMakeRange(0, [textView.text length])];
    
    [textView setAttributedText:string];
    }