Как наблюдать UITextfield.selectedTextRange?

Как создать событие, когда 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
        }
    }
} 

Есть идеи?

10000