Сбой iOS 13 с использованием SwipeKeyboard и текстового поля: shouldChangeCharactersIn: - PullRequest
0 голосов
/ 25 октября 2019

В iOS 13 при реализации shouldChangeCharactersIn через UITextfieldDelegate происходит сбой приложения при использовании смахивающей клавиатуры.

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if let text = textField.text as NSString? {
            let txtAfterUpdate = text.replacingCharacters(in: range, with: string)
            textField.text = txtAfterUpdate
        }
        return false
    }

Это ошибка Apple?

1 Ответ

1 голос
/ 31 октября 2019

Мне удалось воспроизвести это - если вы изменяете состояние текста в UITextField во время ввода с размахом - и только во время ввода с размахом, он будет пытаться повторно вставить содержимое с размахом (даже если вы вернете false), что приведет к повторному запускуВаше делегатское событие, которое запускает рекурсивный цикл.

Это что-то вроде хака, но вы можете поймать его с помощью чего-то вроде

    private var lastEntry: String?

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if string.count > 1 && string == lastEntry { // implies we're swiping or pasting
            print("Caught unwanted recursion")
            return
        }
        lastEntry = string
        if let text = textField.text as NSString? {
            let txtAfterUpdate = text.replacingCharacters(in: range, with: string)
            textField.text = txtAfterUpdate
        }
        return false
    }

Это остановит пользователей от вставки / смахивания одной и той же вещи дважды подряд, но по крайней мере этоЯ позволю им смахивать, пока Apple исправит их проблему.

...