2016-10-20 3 views
1

Здесь я рассмотрел некоторые возникающие вопросы, и я попытался реализовать весь код, но в итоге не смог успешно реализовать какой-либо код. На самом деле, я думаю, я понял, как изменить цвета некоторых текстов внутри UITextView, если текст изначально установлен, но я не понимаю, что когда мой текст tview начал вводить редактирование, он, похоже, не работает должным образом. В следующем, это мой попытка код, который точно выполняет мое желаемое поведение;Как изменить цвет текстовых перемещений внутри UITextView в Swift3

func textViewDidBeginEditing(_ textView: UITextView) { 

    let main_string = "" 
    let getData: [String] = userDefaults.object(forKey: "myData") as! [String] 
    print("\(getData)") 

    let searchWords = "world" 

     let range = (main_string as NSString).range(of: searchWords) 

     let attribute = NSMutableAttributedString.init(string: main_string) 
     attribute.addAttribute(NSForegroundColorAttributeName, value: UIColor.red , range: range) 

     mytextView.attributedText = attribute 


} 

Я сохранил входные данные по именованию MyData. Я попытался использовать for-loop для вывода всех элементов из getData и использовать его как отдельные значения. Однако в консоли есть так много строк объяснения. Я думаю, что это правильный способ писать, но мой mac говорит nooooooo. Однако, если я поставил String внутри main_string и searchWords, например, «это мой вопрос. Я хочу, чтобы люди, чтобы помочь мне из мира» в main_string и «мир» в searchWords, как написано в коде. Затем, после загрузки приложения, на моем текстовом изображении слово «мир» прекрасно окрашено в красный цвет, но после мирового слова весь текст находится в красном цвете. Я не понимаю, почему меня мучает эта неизвестная ошибка.

Так что я хочу сделать это

  1. с сохраненной даты в моем myData, я только хочу, сохраненные слова будут выделены своевременно, когда пользователь вводит в. Например, если пользователь вводит «привет» и "мир". Затем они сохраняются на myData, и они будут выделены только при вводе. И вернитесь к нормальному цвету, когда введенные слова не сохранены.

Предполагаю, у меня нет некоторых объяснений. Если вам нужно что-то знать, пожалуйста, укажите на меня. Огромное спасибо!!

+0

Проверьте мой ответ –

ответ

4

В этом примере я взял пример «мира». При ¨R вводе в TextView то этот метод в работе

func textViewDidChange(_ textView: UITextView) { 
     let attrStr = NSMutableAttributedString(string:txtview.text) 
     let inputLength = attrStr.string.characters.count 
     let searchString = "world" 
     let searchLength = searchString.characters.count 
     var range = NSRange(location: 0, length: attrStr.length) 

     while (range.location != NSNotFound) { 
      range = (attrStr.string as NSString).range(of: searchString, options: [], range: range) 
      if (range.location != NSNotFound) { 
       attrStr.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: NSRange(location: range.location, length: searchLength)) 
       range = NSRange(location: range.location + range.length, length: inputLength - (range.location + range.length)) 
       textView.attributedText = attrStr 
      } 
     }  
} 

Но когда Вы уже установили исходный текст TextView затем использовать этот метод

func textViewDidBeginEditing(_ textView: UITextView) { 
     //Just set your text as you set in textview 
     let attrStr = NSMutableAttributedString(string: "hello world I ma jeckjklwefljlwjflkjwfkljelwfjklfgjwklfjlkwgjwlgkjwklsgjklsjgklsdjgkljdslkgjsdlkgjlksdjgldjsgldjskl world nsfhjklshfklhsllsd fgiw world") 
     let inputLength = attrStr.string.characters.count 
     let searchString = "world" 
     let searchLength = searchString.characters.count 
     var range = NSRange(location: 0, length: attrStr.length) 

     while (range.location != NSNotFound) { 
      range = (attrStr.string as NSString).range(of: searchString, options: [], range: range) 
      if (range.location != NSNotFound) { 
       attrStr.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: NSRange(location: range.location, length: searchLength)) 
       range = NSRange(location: range.location + range.length, length: inputLength - (range.location + range.length)) 
       textView.attributedText = attrStr 
      } 
      } 
    } 

Для нескольких строк, Вы можете делать как этот СВИФТ 3

func textViewDidChange(_ textView: UITextView) { 
     let attrStr = NSMutableAttributedString(string: txtview.text) 
     let inputLength = attrStr.string.characters.count 
     let searchString : NSArray = NSArray.init(objects: "hello","world") 
     for i in 0...searchString.count-1 
     { 

      let string : String = searchString.object(at: i) as! String 
      let searchLength = string.characters.count 
      var range = NSRange(location: 0, length: attrStr.length) 

      while (range.location != NSNotFound) { 
       range = (attrStr.string as NSString).range(of: string, options: [], range: range) 
       if (range.location != NSNotFound) { 
       attrStr.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: NSRange(location: range.location, length: searchLength)) 
       range = NSRange(location: range.location + range.length, length: inputLength - (range.location + range.length)) 
       textView.attributedText = attrStr 
     } 
    } 
    } 
} 

ЦЕЛЬ C
для нескольких строк, можно сделать как этот

-(void)textViewDidChange:(UITextView *)textView 
{ 
    NSMutableAttributedString *attstr = [[NSMutableAttributedString alloc]initWithString:textView.text]; 
    NSUInteger characterCount = [attstr length]; 
    NSArray *arr = [[NSArray alloc]initWithObjects:@"football",@"player",nil]; 

    for (int i=0; i<arr.count; i++) { 

    NSUInteger searchlength = [[NSString stringWithFormat:@"%@",[arr objectAtIndex:i]] length]; 
    NSRange range1 = NSMakeRange(0, attstr.length); 

    while (range1.location != NSNotFound) { 
     range1 =[attstr.string rangeOfString:[NSString stringWithFormat:@"%@",[arr objectAtIndex:i]] options:0 range:range1]; 
     if (range1.location !=NSNotFound) { 
      [attstr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(range1.location, searchlength)]; 
      [attstr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:20.0] range:range1]; 
      range1 = NSMakeRange(range1.location + range1.length, characterCount -(range1.location + range1.length)); 
      textView.attributedText = attstr; 
     } 
    } 
} 
+0

Это очень полезно. Большое спасибо. Но у меня есть еще один вопрос. Если в массиве String есть несколько слов, как я могу реализовать такой код? – bagels

+0

@ryohei Я обновлю свой ответ на ваш вопрос, но в соответствии с вашим самым первым вопросом, мой ответ прекрасен, поэтому, пожалуйста, одобрите для других –

+0

хорошо, я смотрю вперед. – bagels

Смежные вопросы