Как определить, когда тип клавиатуры iOS по умолчанию переключается с текста на цифры
Есть много сообщений об уведомлении пользователя, когда тип клавиатуры меняется с таких вещей, как цифровая клавиатура, на значение по умолчанию. Это вопрос о том, когда пользователь нажимает на [123]
или [ABC]
кнопка на клавиатуре по умолчанию.. в основном я хочу знать, когда этот экран
изменения на этом экране
пробую это:
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
NSLog(@"::::::: this is text field type %d", searchBar.keyboardType);
естественно всегда возвращай 0
который является типом клавиши по умолчанию.. так как предполагается, что оба имеют одинаковый тип клавиатуры.
5 ответов
Я столкнулся с этой же проблемой сегодня и был отчасти изумлен, что нет никакого способа обнаружить это изменение с помощью какого-либо уведомления или метода делегирования, так как я думаю, что это довольно распространенная необходимость. Я строю многопольные поля ввода для ввода пин-кода. Я автоматически перехожу к следующим / предыдущим полям после ввода значения и не хочу, чтобы клавиатура возвращалась к значениям по умолчанию каждый раз, когда я переключаю поля. Я придумал это решение (примечание: это не решает его идеально, потому что требует, чтобы пользователь что-то набрал, но решает его для нужд, аналогичных этому представлению вывода).
У меня есть собственное представление под названием MyPinView, это представление имеет переменную
var keyBoardType = UIKeyboardType.alphabet
и массив UITextFields
var pinFields = [UITextField]()
Для упрощенной версии я не буду подробно останавливаться на обработке крайних случаев, требующих shouldChangeCharactersInRange
быть реализованным и будет придерживаться моей реализации обработчика событий.
По сути, вам нужно посмотреть, какой текст был набран, и определить, какую клавиатуру показывать при продвижении полей (моя поддерживает только цифры и буквы, переключаемые с помощью кнопки abc / 123, поэтому я буду игнорировать эмодзи и другие типы).
// 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
, Основной случай, когда это не поможет, - сохранение состояния клавиатуры между полями ввода, когда пользователь переключил клавиатуру, но ничего не набрал. В целом, это помогает сценарию такого типа быть более удобным.
Надеюсь, это поможет, счастливого программирования.
Нет API для обнаружения изменения клавиатуры: ссылка на класс UITextField
Определение keyboardType является частью протокола UITextInputTraits. Установка типа клавиатуры, например ASCII, в основном является стандартной клавиатурой, показывающей буквенную часть клавиатуры. Если вы установили для KeyType значение UIKeyboardTypeNumbersAndPunctuation, вы получите ту же клавиатуру, что и ASCII, ожидайте, что клавиатура будет показана сначала с цифровой частью клавиатуры.
В итоге, ASCII и клавиатура чисел и пунктуации - это одна и та же трехэкранная клавиатура, представленная двумя различными способами.
Вы можете обнаружить изменения в типе клавиатуры в textDidChange. Если это так, пользователь может выбрать кнопку клавиатуры, и вы можете проверить свойство keyboardType для UITextField:
KeyboardType: UIKeyboardTypeNumberPad или UIKeyboardTypeDefault
Таким образом, вы можете сохранить текущий тип, обнаружить смену клавиатуры и сравнить новый тип клавиатуры с первым.
Я думаю, что невозможно определить тип переключателя клавиатуры. Возможно, вы сможете объяснить свою проблему или чего вы хотите достичь, чтобы мы могли найти другой способ ее решения.
С уважением
Настройка клавиатуры для текстовых объектов Атрибуты клавиатуры настраиваются непосредственно через текстовые объекты вашего приложения. Классы UITextField и UITextView соответствуют протоколу UITextInputTraits, который определяет свойства для настройки клавиатуры. Установка этих свойств программно или в окне инспектора Интерфейсного Разработчика заставляет систему отображать клавиатуру назначенного типа.
@property(nonatomic) UIKeyboardType keyboardType