Я хочу прослушивать каждое изменение текста в UITextView. Настройка очень тривиальна.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(
self,
selector: #selector(textViewDidChangeWithNotification(_:)),
name: UITextView.textDidChangeNotification,
object: nil
)
}
@objc private func textViewDidChangeWithNotification(_ notification: Notification) {
print("Text: \(String(describing: inputTextView.text))")
}
В большинстве случаев он работает нормально, но потом я нашел несколько магов черного ящика UITextInput c.
Шаг 1: «Я» напечатал. В выводе мы видим «I».
Шаг 2: Важный шаг. Выделите весь текст двойным нажатием на поле.
Шаг 3: Выберите «Если» из предложенных слов.
И в выводе отладчика нет «Если». С другой стороны, если курсор будет в конце слова «I», и мы выберем «Если», результаты будут правильными.
Есть ли способ наблюдать ВСЕ изменения текста?
Я могу получить текст, используя:
func textViewDidEndEditing(_ textView: UITextView)
, но мне нужно наблюдать за всеми изменениями в реальном времени. Другой вариант, который я всегда вижу, - это использовать:
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool
, но этот метод - плохая практика для наблюдения за изменениями. Если вы вводите два пробела несколько раз, iOS заменит первый пробел точкой и, очевидно, не будет информировать вас об этом действии в этом методе и о множестве других проблем с ним.