Определить комбинации клавиш, которые изменяют текст - PullRequest
2 голосов
/ 24 марта 2019

У меня есть библиотека, которую я создаю, которая должна отслеживать ввод текста в UITextView, чтобы отслеживать положения определенных разделов текста. Большинство случаев обрабатываются нормально в методе textView(_:shouldChangeTextIn:replacementText:). Проблема, с которой я сталкиваюсь, состоит в том, что некоторые клавиатуры имеют комбинации символов, которые фактически изменяют символ без вызова метода textView(_:shouldChangeTextIn:replacementText:). Простой пример этого: если вы выберете вьетнамскую клавиатуру и наберете uw, она изменится на ú, но единственные вызовы textView(_:shouldChangeTextIn:replacementText:) будут для ввода u и w. Расчет смещения будет неправильным в этой точке. Насколько я могу судить, нет другого метода, который я мог бы использовать, чтобы узнать об этом изменении. Я не уверен, является ли это ошибкой или нет. Будет вызван метод textViewDidChange, но я надеялся избежать хакерской логики, где я сравниваю предыдущий и новый текст textView, чтобы определить любые изменения и настроить там логику. Если у кого-то есть предложения, я буду рад их услышать. Надеюсь, кто-то видел и решил эту проблему. Благодарю.

Чтобы уточнить, мне нужно разобраться с этой ситуацией, используя что-то, кроме подклассов.

Пример проекта: https://github.com/szweier/ShouldChangeTextInRange Если вы запустите приведенный выше код и выберете вьетнамскую клавиатуру для ввода uw, вы увидите, что строка, сгенерированная в методе textView(_:shouldChangeTextIn:replacementText:), будет отличаться от текста в textView.

1 Ответ

0 голосов
/ 24 марта 2019

UITextView или его делегат не имеет shouldReplaceCharacters API, насколько я знаю (и я не нахожу ничего полезного, по крайней мере для iOS - он существует для macOS, хотя)

Если я подкласс UITextView, я могу переопределить insertText и определить истинную точку вставки:

class TestTextView : UITextView {
    override func insertText(_ text: String) {

        let selectedRange = self.selectedRange
        if let markedRange = self.markedTextRange {
            Swift.print("TestTextView inserting \(text) at \(selectedRange.location) & \(selectedRange.length) ; marked = \(markedRange.start) & \(markedRange.end)")
        } else {
            Swift.print("TestTextView inserting \(text) at \(selectedRange.location) & \(selectedRange.length) and no marked range")
        }
        super.insertText(text)
    }
}

Когда я добавлю этот подкласс TestTextView втестовый проект и включите клавиатуру VN.Вот что я вижу для uw, набранного:

TestTextView inserting u at 17 & 0 and no marked range
TestTextView inserting ư at 17 & 0 and no marked range

, тогда как "e" и "b", введенные последовательно, выглядят так:

TestTextView inserting e at 17 & 0 and no marked range
TestTextView inserting b at 18 & 0 and no marked range

My Test Project UI looks like this

Наконец, мой ответ довольно прост, и вам может понадобиться отслеживать «отмеченный диапазон текста», который вступает в игру с этим многоступенчатым вводом текста .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...