Ответ 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
. Основной случай, когда это не поможет, заключается в сохранении состояния клавиатуры между полями ввода, где пользователь переключил клавиатуру, но не набрал ничего. В целом, однако, это помогает использовать этот тип сценария более удобным.
Надеюсь, это поможет, счастливое программирование.