Однако мы не можем использовать встроенный 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
Есть ли способ игнорировать промежуточные входные данные от IME и учитывать только окончательные входные данные?
В Android мы используем метод beforeTextChanged в TextWatcher, чтобы игнорировать промежуточные входные данные из IME и учитывать только окончательные входные данные. Вы можете увидеть это в действии на этом
Android захватывает только «我»

Есть ли в iOS эквивалентный способ игнорировать промежуточные входные данные от IME и принимать во внимание только окончательные входные данные?< /п>
Подробнее здесь: https://stackoverflow.com/questions/786 ... me-support
Мобильная версия