Как определить, когда тип клавиатуры 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
Другие вопросы по тегам