Как создать событие, когда UITextfield.selectedTextRange был изменен?
Я не нашел никакого метода делегата для этого. Может быть, я могу создать пользовательский обозреватель как-нибудь? Я не могу понять, как это сделать.
Цель состоит в том, чтобы вызвать некоторый метод, когда selectedTextRange в поле UIText был изменен, и получить указатель на это поле UIText также для работы с целевым текстовым полем внутри.
Я пытался переопределить selectedTextRange, но он вызывается в режиме реального времени много раз при перетаскивании курсора. И запускаемый метод является достаточно тяжелым, чтобы вызвать замедление пользовательского интерфейса при запуске 100 раз в секунду.
Всего 1 ответ
Для> = iOS 13
Вы можете сделать это, реализовав функцию textFieldDidChangeSelection:
с объявлением локальной переменной, которая будет хранить самый последний выбранный текстовый диапазон TextField. Вам нужно сохранить последний выбор, чтобы получать уведомления только о новом выборе, а не о других изменениях TextField (например, путем ввода).
class MyViewController: UIViewController {
private var lastSelectedText = ""
// Rest of your MyViewController code
}
extension MyViewController: UITextFieldDelegate {
func textFieldDidChangeSelection(_ textField: UITextField) {
if let textRange = textField.selectedTextRange, let selectedText = textField.text(in: textRange), selectedText != lastSelectedText {
lastSelectedText = selectedText
// Handle change of selectedText or selectedTextRange
}
}
}
Для iOS 12> =
Как вы упомянули, вы можете переопределить свойство selectedTextRange
UITextField. Я только что проверил это, и он работает плавно при каждом изменении курсора.
class MyTextField: UITextField {
override var selectedTextRange: UITextRange? {
get {return super.selectedTextRange}
set {
// Handle newValue here
super.selectedTextRange = newValue
}
}
}