1

Я использую NSMutableAttributedString для изменения текста в UITextView в качестве типов пользователей. Когда пользователь вводит «# HELLO #» или «# TEST #» или «# test #», эти строки должны быть красными (просто пример).Изменение цвета малых слов ('in') в UITextView с использованием NSMutableAttributedString

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

Это работает почти для каждого слова, кроме 'in'. Когда я печатаю это, «in» является черным, а не белым ([UIColor whiteColor]). Если я типа «T», «т» в «# тест #» побелеет.

Я действительно путают, кто-нибудь может мне помочь? Я думал, что else часть должна поймать этих строк. Спасибо.

+0

Несколько вещей, которые ma y быть проблемой после: 'rangeOfString:' возвращает только первое вхождение. Поэтому, если у вас есть # # HELLO # # HELLO #, то только первый будет окрашен. Или, например, '# HELLO # output output" (только первый выход будет белым). Кроме того, в начале было бы интересно использовать 'NSString * textViewText = textView.attributedText;' каким-то образом. Не помню, если по умолчанию , если у вас есть 'NSAttributedString', он сохранит свое свойство' string' в свой 'text'. – Larme

ответ

0

Я пробовал свой код. Я предполагаю, что проблема - это диапазон, который вы устанавливаете. Поскольку это всегда одно слово, оно устанавливает атрибут цвета первого вхождения этого конкретного слова. Будет ли оно # HELLO # или in. Попробуйте ввести конкретный строка, несколько раз разделенная пробелом, вы всегда получите тот же результат. Я внесла несколько изменений в ваш код, и вы можете увидеть это ниже. Попробуйте это.

- (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]; 
} 
Смежные вопросы