Отслеживание и изменение цвета текста в UITextView - PullRequest
0 голосов
/ 13 января 2019

Поскольку пользователь вводит текстовое представление, я просматриваю каждое слово и вижу, что оно соответствует словам в массиве, который у меня есть. Если есть совпадение, слово меняется на синий, а булева переменная didFindACertainWord устанавливается в true (чтобы убедиться, что только одно слово синее). Я смог успешно выполнить эту часть с несколькими ошибками:

  1. Определенное слово, которое я изменил на синий, работает, но слова, набранные до шрифта, меняются, и все, что я печатаю после слова, тоже синего цвета (что мне не нужно). Я хочу изменить только определенное слово на синий, оставив остальные слова черным цветом и тем же шрифтом, что и раньше.

  2. Не могу понять, как узнать, удалил ли пользователь определенное слово. Если они это сделают, Я хочу изменить цвет определенного слова обратно на черный (после того, как они удалили первый символ определенного слова) и установить didFindACertainWord в false.

Вот мой текущий код в моем textViewDidChange методе:

func textViewDidChange(_ textView: UITextView) {
    //get last word typed
    let size = textView.text.reversed().firstIndex(of: " ") ?? textView.text.count
    let startWord = textView.text.index(textView.text.endIndex, offsetBy: -size)
    let lastWord = textView.text[startWord...]

    //check if last word is in array and we did not already find one
    if certainWords.contains(String(lastWord)) && !didFindACertainWord {
        didFindACertainWord = true

        //change color of the word
        let attributedString = NSMutableAttributedString.init(string: textView.text)
        let range = (textView.text as NSString).range(of: String(lastWord))
        attributedString.addAttributes([NSAttributedString.Key.foregroundColor: UIColor.blue, NSAttributedString.Key.font: UIFont(name: "Avenir-Roman", size: 18)], range: range)
        textView.attributedText = attributedString
    }
}

Чего мне не хватает / как я могу сделать это успешно? Постскриптум шрифт всего текста в текстовом представлении должен быть UIFont(name: "Avenir-Roman", size: 18)

Я ищу каждое слово, потому что после того, как пользователь набирает слово действия, мне нужно прочитать следующие слова, если они связаны со словом действия, чтобы выделить их жирным шрифтом. Например, если пользователь вводит «см. Париж Лондон Берлин, чтобы найти лучшую еду», словом действия является «см.», И связанные слова, которые должны быть выделены жирным шрифтом, это места «Париж Италия Франция» и слова не связанные (будут в обычном порядке). шрифт) "найти лучшее"

1 Ответ

0 голосов
/ 13 января 2019

Для первого вопроса это потому, что вы должны выполнить случай "else" и сбросить цвет и логическое значение. Вы должны добавить:

} else {
    didFindACertainWord = false
    textView.attributedText = attributedString
}

Для второго вам не нужно продолжать работать только с последним словом, вместо этого проверьте, есть ли совпадение во всей строке.

Не проверено, но должно работать:

func textViewDidChange(_ textView: UITextView) {

    let attributedString = NSMutableAttributedString(string: textView.text,
                                                     attributes: [.font: UIFont(name: "Avenir-Roman", size: 18)])

    let allWords = attributedString.string.components(separatedBy: CharacterSet.whitespaces)
    if let firstMatch = allWords.first(where: { return certainWords.contains($0)}) {
        didFindACertainWord = true
        let firstMatchRange = (attributedString.string as NSString).range(of: firstMatch)
        attributedString.addAttribute(.foregroundColor, value: UIColor.blue, range: firstMatchRange)
    } else {
        didFindACertainWord = false
    }
    textView.attributedText = attributedString
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...