Как определить, когда тип клавиатуры по умолчанию iOS переключается с текста на цифры

Есть много сообщений об уведомлении пользователя, когда тип клавиатуры изменяется от таких вещей, как числовая панель, по умолчанию. Этот вопрос связан с пониманием того, когда пользователь нажимает кнопку [123] или [ABC] на клавиатуре по умолчанию. В основном я хочу знать, когда этот экран

enter image description here

изменяется на этот экран

enter image description here

попытка:

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    NSLog(@"::::::: this is text field type %d", searchBar.keyboardType);

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

Ответ 1

Сегодня я столкнулся с этой проблемой и был изумлен тем, что нет способа обнаружить это изменение из любого метода уведомления или делегирования, поскольку я думаю, что это довольно распространенная потребность. Я создаю многопользовательский текстовый поле ввода для захвата пин-кода. Я автоматически продвигаюсь к следующим/предыдущим полям при вводе значения и не хочу, чтобы клавиатура переключалась на значение по умолчанию при каждом переключении полей. Я придумал это решение (примечание: это не решит его полностью, потому что он требует, чтобы пользователь набирал что-то, но решает его с аналогичными потребностями в этом представлении).

У меня есть пользовательское представление MyPinView, это представление имеет var

var keyBoardType = UIKeyboardType.alphabet

и массив UITextFields

var pinFields = [UITextField]()

который изложен таким образом. введите описание изображения здесь

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

В принципе, вам нужно увидеть, какой текст был введен, и определить, какую клавиатуру показывать при продвижении полей (мой поддерживает только числа и буквы, переключаемые с помощью кнопки abc/123, поэтому я буду игнорировать emoji и другие типы).

// MARK: UITextField Event
func textFieldDidChange(textField: UITextField) {
    // If the user typed one character, move to the next cell.
    if (textField.text?.count == 1) {
        let index = pinFields.index(of: textField)
        textField.resignFirstResponder()
        if (pinFields.count > index! + 1) {
            let pinField = pinFields[index! + 1]
            self.updateKeyboardTypeForString(input: textField.text)
            pinField.keyboardType = self.keyBoardType
            pinField.becomeFirstResponder()
        }
    } // If they deleted the character move to previous cell
    else if (textField.text?.count == 0) {
        let index = pinFields.index(of: textField)
        if (index! - 1 >= 0) {
            let pinField = pinFields[index! - 1]
            self.updateKeyboardTypeForString(input: pinField.text)
            pinField.keyboardType = self.keyBoardType
            pinField.becomeFirstResponder()
        }
    }
}

// MARK: - Keyboard Type Helper
func updateKeyboardTypeForString(input:String?) {
    let letters = NSCharacterSet.letters
    let digits = NSCharacterSet.decimalDigits
    let pinText = input == nil ? "" : input
    for uniScalar in pinText!.unicodeScalars {
        if letters.contains(uniScalar) {
            self.keyBoardType = UIKeyboardType.alphabet
        } else if digits.contains(uniScalar) {
            self.keyBoardType = UIKeyboardType.numbersAndPunctuation
        }
    }
}

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

Надеюсь, это поможет, счастливое программирование.

Ответ 2

Настройка клавиатуры для текстовых объектов Вы настраиваете атрибуты клавиатуры непосредственно через текстовые объекты вашего приложения. Классы UITextField и UITextView соответствуют протоколу UITextInputTraits, который определяет свойства для настройки клавиатуры. Установка этих свойств программно или в окне инспектора интерфейса Builder приводит к тому, что система отображает клавиатуру указанного типа.

@property(nonatomic) UIKeyboardType keyboardType

Ответ 3

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

Привет

Ответ 4

Отсутствует API для обнаружения изменения клавиатуры: ссылка класса UITextField

Определение типа keyboardType является частью протокола UITextInputTraits. Установка типа клавиатуры, например. ASCII, в основном стандартная клавиатура, отображающая буквенную часть клавиатуры. Если вы установите для клавиатуры тип UIKeyboardTypeNumbersAndPunctuation, вы получите ту же клавиатуру, что и ASCII, ожидая, что клавиатура будет показана с первой частью клавиатуры.

В сводке, ASCII и клавиатура Numbers и Punctuation - это одна и та же трехэкранированная клавиатура, которая представлена ​​двумя разными способами.

Ответ 5

Вы можете обнаружить изменения типа клавиатуры в textDidChange. Если это так, пользователь выбирает клавиатуру, и вы можете проверить свойство keyboardType для UITextField:

KeyboardType: UIKeyboardTypeNumberPad или UIKeyboardTypeDefault

Итак, yo может сохранить текущий тип, обнаружить изменение клавиатуры и сравнить новый тип клавиатуры с первым.