Как наблюдать UITextfield.selectedTextRange? - PullRequest
1 голос
/ 08 февраля 2020

Как создать событие, когда UITextfield.selectedTextRange был изменен?

Я не нашел ни одного метода делегата для этого. Может быть, я могу создать пользовательский обозреватель как-нибудь? Я не могу понять, как это сделать.

Цель состоит в том, чтобы вызвать некоторый метод, когда selectedTextRange в поле UIText был изменен, и получить указатель на это поле UIText, чтобы также работать с целевым текстовым полем внутри.

Я пытался переопределить selectedTextRange, но он вызывается в режиме реального времени много раз при перетаскивании курсора. И запускаемый метод достаточно тяжел, чтобы вызвать замедление пользовательского интерфейса при срабатывании 100 раз в секунду.

1 Ответ

0 голосов
/ 09 февраля 2020

Для> = iOS 13

Этого можно достичь sh, реализовав функцию textFieldDidChangeSelection: с объявлением локальной переменной, в которой будет храниться последний выбранный текстовый диапазон. текстового поля. Вам нужно сохранить последний выбор, чтобы получать уведомления только о новом выборе, а не о других изменениях 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
        }
    }
} 
...