UITextField игнорирует shouldChangeCharactersIn с временными акцентами - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь разрешить ввод десятичных цифр только в приложении для iOS. У меня есть этот фрагмент, который очень хорошо работает во всех ситуациях.

override func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let allowedCharacters = NSMutableCharacterSet.decimalDigit()
    let characterSet = CharacterSet(charactersIn: string)
    return allowedCharacters.isSuperset(of: characterSet)
}

Это настолько просто, насколько это возможно, и это был ответ, который я нашел повсюду на SO.

Однако , вот в чем проблема: акцентированные символы без букв. Трудно объяснить это поведение. Когда я пишу такой символ, как ¨ или `, я попадаю в состояние, в котором я могу использовать такой символ, как e, чтобы получить è. Это довольно стандартный способ ввода символов с акцентом на пользователя.

Мы попадаем в это состояние, где подсвечивается ¨, и я могу выполнить o, чтобы затем получить ö. enter image description here Однако символ с ударением (¨) не вызывал shouldChangeCharactersIn range вызов. Похоже, iOS решает проигнорировать этот результат и по-прежнему добавляет в символ.

Как я могу заблокировать это поведение ? Насколько я понимаю, это можно воспроизвести только с помощью аппаратной клавиатуры, но мы ожидаем, что наши пользователи будут ее использовать.

1 Ответ

0 голосов
/ 26 апреля 2018

Когда пользователь вводит объединяющий диакритический знак, такой как умляут, ваш метод вообще не называется . Затем пользователь вводит какой-то другой символ, такой как o, и ваш метод возвращает false. В этот момент умлаут вводится в поле и отображается в textField.text. Вы должны обнаружить это и удалить его.

...