Автокапитализация текстового поля iOS не работает

#ios #uitextfield #capitalization

#iOS #uitextfield #капитализация

Вопрос:

Я создал новый проект, в котором есть только одно текстовое поле, и я установил заглавные буквы для всех символов. Я пробовал это как из конструктора интерфейса, так и из кода:

 [self.textField setAutocapitalizationType:UITextAutocapitalizationTypeAllCharacters];
  

Независимо от того, что я пытаюсь, это результат:

Я знаю, что настройки автоматической капитализации клавиатуры можно изменить в настройках — Общие — Клавиатура — Автокапитализация, но я предполагаю, что не было бы смысла иметь свойство AutocapitalizationType в текстовом поле, если оно все равно перезаписано iOS.

Это также не работает для UITextAutocapitalizationTypeWords.

Это происходит в iOS 10.0.2 на iPhone 6S (в других ответах говорится, что это происходит в симуляторе, но это не так).

Есть идеи, в чем проблема?

Ответ №1:

Я знаю, что настройки автоматической капитализации клавиатуры можно изменить в Settings — General — Keyboard — Auto-Capitalization, но я предполагаю, что не было бы смысла иметь свойство AutocapitalizationType в текстовом поле, если оно все равно перезаписано iOS.

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

Комментарии:

1. Действительно, установка переключателя в положение on приведет к тому, что каждое текстовое поле в каждом приложении будет соответствовать его капитализации. Установка переключателя в положение выкл. всегда будет отображать клавиатуру заглавными буквами, независимо от того, какая заглавная буква установлена в приложении.

2. @WonderDog Вот что я имел в виду. autocapitalizationType работает скорее как рекомендация для системы, но если пользователь хочет, он может полностью отключить это.

Ответ №2:

Одним из способов принудительного представления всех заглавных букв в текстовом поле независимо от директивы autocapitalization было вставить этот небольшой поворот в функцию UITextFieldDelegate:

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

Вставленные символы также будут заглавными, как и ожидалось.