Добавление атрибута к NSMutableAttributedString в определенном диапазоне - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь добавить атрибут фона к своему NSMutableAttributedString для определенного диапазона, который работает нормально, если начальный диапазон равен 0. Всякий раз, когда я пытаюсь передать индекс функции, к которой добавляется фоннамного больше текста, чем предполагалось.

Вот видео, демонстрирующее проблему.Всякий раз, когда пользователь пишет неправильное письмо, появляется проблема.

Видео демонстрация

Код:

var index = 0

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
{
    guard let char = string.cString(using: String.Encoding.utf8) else { return true }
    let isBackSpace = strcmp(char, "\\b")
    if (isBackSpace == -92)
    {
        addBackground(color: .clear, from: index - 1, to: index)
        index -= 1
    }
    else
    {
        if charactersDoesMatch(char: string, i: index)
        {
            addBackground(color: .green, from: 0, to: index + 1)
        }
        else
        {
            //As you can see im trying to add it from the current index to the next one only.
            addBackground(color: .red, from: index, to: index + 1)
        }
        index += 1
    }
    return true
}

private func addBackground(color: UIColor, from: Int, to: Int)
{
    attributedText?.addAttribute(NSAttributedStringKey.backgroundColor, value: color, range: NSMakeRange(from, to))
    toTypelabel.attributedText = attributedText
}

1 Ответ

0 голосов
/ 25 сентября 2018

Кажется, я понял вашу проблему

func NSMakeRange(_ loc: Int, 
           _ len: Int) -> NSRange

Принимает расположение параметров, а второе - длину, поэтому при вводе неправильного значения вы вводите 1 как параметр, означающий, что только один символ должен быть окрашен в красный цвет

addBackground(color: .red, from: index, to: 1)

Для получения дополнительной информации о яблочной документации: NSMakeRange

...