2015-09-06 3 views
-3

Из того, что я прочитал, мне нужно будет использовать rangeOfString для поиска записи в текстовом виде, но я не уверен, как это сделать. Можно ли изменить цвет текста, введенного в текстовое представление в реальном времени, например, если кто-то написал «синий», я могу изменить слово на синий в тот момент, когда они набрали его. Если да, то как я могу это сделать? Я очень новичок в кодировании и даже новее.Если бы я хотел изменить цвет определенного слова, введенного в textview, как бы я это сделал?

+0

Будучи новым, не дает вам пропуск на прикладывая усилие в себе. Сначала попробуйте, начните с чтения документации. Я отведу вас в правильном направлении, но вы не можете ожидать, что люди сделают все для вас. Это не то, о чем СО. Вы должны просмотреть ссылки и документацию UITextView и ответить, как что-то изменить в 'UITextView', вы должны посмотреть на' NSAttributedString' или 'NSMutableAttributedString' – soulshined

+0

. Прежде чем делать такие комментарии, возможно, вам стоит узнать о серии изменений синтаксиса, сделанных между быстрыми 1 и быстрыми 2, такими как countElements, которые изменяются просто для подсчета. Я не прошу кого-нибудь написать что-нибудь для меня, просто укажите мне в правильном направлении. Даже используя решения из официальной документации, такие как let boldRange = text.rangeOfString (NSLocalizedString ("bold", comment: "")) не всегда работают правильно. Я прошу людей с опытом работы на этом языке помочь мне в решении. Если вы не предложите помощь, возможно, вам лучше не комментировать. – SandySunday

+0

Это не личное нападение. Его способ поощрять новичков к участию в исследованиях и попытках самостоятельно. Это не только ограничивает повторяющиеся вопросы (которые являются общими на этом сайте), это потенциально ограничивает неопределенные ответы, например, приведенные ниже.Следуя инструкциям [SO Guidelines] (http://stackoverflow.com/help/how-to-ask), чтобы задать хороший вопрос, некоторые из основных заметок в нем есть исследование, __showing effort__, предоставление кода для сужения решения, также не позволяет пользователям отправлять ответ, который не имеет ничего общего с темой. Сохраняет чистый и беспорядочный сайт :) – soulshined

ответ

1

Вам нужно будет использовать отнесенный текст для вашего текстового вида, а затем использовать textView(textView: UITextView, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool, который будет срабатывать при каждом изменении текста в текстовом виде. Примените свою собственную логику к тому, в какой диапазон будет попадать цветной текст и как это произойдет ...

Убедитесь, что ваш контроллер соответствует протоколу UITextViewDelegate и передайте делегату textView ваш контроллер.

Демонстрация:

class ViewController: UIViewController, UITextViewDelegate { 

    @IBOutlet weak var textView: UITextView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.textView.delegate = self // important! Otherwise the textView will not know where to call the delegate functions! 
    } 

    func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { 

     // first make sure that the text field is the one we want to actually change 
     if textView == self.textView{ 

      let nsString = textView.text as NSString // we explicitly cast the Swift string to NSString so that we can use rangeOfString for example 
      let stringLength = textView.text.characters.count 
      // Arbitrarily check if the string in the text field is not empty 
      // Apply your own logic for when to update the string 
      if stringLength > 0{ 

       let text = NSMutableAttributedString(string: textView.text) 
       // Currently the range is assumed to be the whole text (the range covers the whole string) 
       // You'll have to apply your own logic here 
       text.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSMakeRange(0, stringLength)) 

       textView.attributedText = text 

      } 
     } 
     return true 

    } 

} 

Например, вместо того, чтобы использовать выше, чтобы цвет целом текст по

text.addAttribute (NSForegroundColorAttributeName, значение: UIColor.redColor(), диапазон: NSMakeRange (0 , StringLength))

Раскрасьте первое вхождение "привет" в красном цвете:

text.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: nsString.rangeOfString("hello")) 

Обратите внимание, что я явно отливать текст textView «s в NSString так, что мы можем использовать диапазон функций, таких как (rangeOfString())

+0

хорошо, поэтому я выяснил проблему, с которой я столкнулся с этим ответом, а некоторые другие - это то, что в swift count больше нет члена строки. Есть ли способ обойти это. – SandySunday

+1

Я думаю, что проблема в том, что вам нужно научиться делать больше исследований самостоятельно. В новой строке Swift строки Swift имеют другую структуру, вы можете получить доступ к длине строки следующим образом: 'str.characters.count'. –

0

Изменения были сделаны для быстрого, в котором счет больше не работает со строкой. Я немного изменил ответ, заданный the_critic (https://stackoverflow.com/users/1066899/the-critic). Спасибо всем, кто помог

класс ViewController: UIViewController, UITextViewDelegate {

@IBOutlet weak var textView: UITextView! 
override func viewDidLoad() { 
    super.viewDidLoad() 

    self.textView.delegate = self // important! Otherwise the textView will not know where to call the delegate functions! 
} 

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { 

    // first make sure that the text field is the one we want to actually change 
    if textView == self.textView{ 

     let nsString = textView.text as NSString // we explicitly cast the Swift string to NSString so that we can use rangeOfString for example 
     let stringLength = textView.text.characters.count 
     // Arbitrarily check if the string in the text field is not 

пустой // Применить собственную логику, когда обновить строку если StringLength> 0 {

  let text = NSMutableAttributedString(string: textView.text) 
      // Currently the range is assumed to be the whole text (the range covers the whole string) 
      // You'll have to apply your own logic here 
      text.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSMakeRange(0, stringLength)) 

      textView.attributedText = text 

     } 
    } 
    return true 

} 

}

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