#swift #text #uitextview #subclass
#swift #текст #uitextview #подкласс
Вопрос:
Я хочу наблюдать за текстом var! свойство UITextView, я не хочу использовать делегат.
Мое решение таково:
class MessageTextView: UITextView {
override var text: String! {
didSet {
print(text)
}
}
}
Но он не вызывается при вводе в текстовое поле UITextView.
Я также попробовал textStorage и selectedRange. Для меня имеет смысл только переопределить текст, но это не работает. Есть решение?
Редактировать: это мое решение:
deinit {
NotificationCenter.default.removeObserver(self, name: UITextView.textDidChangeNotification, object: nil)
}
func setObserverNotification() {
NotificationCenter.default.addObserver(self, selector: #selector(updateText), name: UITextView.textDidChangeNotification, object: nil)
}
@objc private func updateText() {
// Do updates here
}
Ответ №1:
Для меня имеет смысл только переопределить текст, но это не работает.
Кажется маловероятным, что UITextView фактически устанавливает какое-либо из свойств, которые вы пытались переопределить при каждом вводе символа. Фактическое содержимое текстового представления хранится в объекте UITextStorage, который создается один раз и изменяется по мере необходимости, поэтому переопределение textStorage
установщика будет вызываться в лучшем случае один раз, а не при каждом вводе. text
Установщик вообще не вызывается из-за изменений — вы можете вызвать его, чтобы получить или установить содержимое, но изменения не изменяют весь контент.
Если вы хотите узнать, когда текстовое представление получает уведомление, но не хотите использовать делегат, вместо этого вы можете прослушивать уведомления. UITextViewTextDidChangeNotification
отправляется всякий раз, когда в текст вносятся изменения.