Реализация функции отмены/повтора в UITextView с поддержкой IMEIOS

Программируем под IOS
Ответить
Anonymous
 Реализация функции отмены/повтора в UITextView с поддержкой IME

Сообщение Anonymous »

В настоящее время мы реализуем функцию отмены/повтора в UITextView.
Однако мы не можем использовать встроенный UndoManager в UITextView потому что у нас есть несколько экземпляров UITextView внутри UICollectionView.
Поскольку UICollectionView перерабатывает экземпляры UITextView, один и тот же UITextView может использоваться повторно в разных строках, что делает встроенный UndoManager ненадежным.
Метод mustChangeTextIn в UITextViewDelegate является ключом к правильной реализации функций отмены/повтора. Вот пример нашей реализации:

Код: Выделить всё

extension ChecklistCell: UITextViewDelegate {
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
// Get the current text
let s = textView.text ?? ""

// Get the starting position of the change
let start = range.location

// Get the number of characters that will be replaced
let count = range.length

// Get the number of characters that will be added
let after = text.count

print(">>>> The current text = \"\(s)\"")
print(">>>> The starting position of the change = \(start)")
print(">>>> The number of characters that will be replaced = \(count)")
print(">>>> The number of characters that will be added = \(after)")
print(">>>>")

if let delegate = delegate, let checklistId = checklistId, let index = delegate.checklistIdToIndex(checklistId) {
delegate.attachTextAction(s: s, start: start, count: count, after: after, index: index)
}

return true
}
}
Вот как это выглядит.
https://www.facebook.com/wenotecolor/videos /2174891132886868 — Отмена/повтор работает очень хорошо на английском языке.
Рабочая сцена за UITextViewDelegate
Изображение


Однако эта реализация не работает хорошо с неанглийским вводом с использованием IME. При использовании IME перед созданием окончательного ввода происходит промежуточный ввод. Например, если ввести «wo» (промежуточный ввод), получится «我» (последний ввод). В настоящее время UITextViewDelegate захватывает как «wo», так и «我».

Код: Выделить всё

UITextViewDelegate
захватывает как «wo», так и «我»
Изображение

Есть ли способ игнорировать промежуточные входные данные от IME и учитывать только окончательные входные данные?

В Android мы используем метод beforeTextChanged в TextWatcher, чтобы игнорировать промежуточные входные данные из IME и учитывать только окончательные входные данные. Вы можете увидеть это в действии на этом
Android захватывает только «我»
Изображение

Есть ли в iOS эквивалентный способ игнорировать промежуточные входные данные от IME и принимать во внимание только окончательные входные данные?< /п>

Подробнее здесь: https://stackoverflow.com/questions/786 ... me-support
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»