UITextField больше не перезагружает тип клавиатуры после вызова reloadInputViews

В iOS 7 я могу изменить тип клавиатуры, пока это firstResponder ( "на лету" ):

if (textField.text.length > 2) {

    textField.keyboardType = UIKeyboardTypeNumbersAndPunctuation;
}
else
{
    textField.keyboardType = UIKeyboardTypeDefault;
}

[textField reloadInputViews];

// (Omitting some efficiency stuff to keep example to bare bones)

Это больше не работает под Xcode 6/iOS 8. Документация в основном отражает изменения в пользовательской клавиатуре.

Использование функции resign/the first responder (все еще) работает:

[textField resignFirstResponder];

// Make keyboard change

[textField becomeFirstResponder];

Но это просто похоже на перебор. Это разрывает и восстанавливает стену, просто чтобы изменить картину на ней.

Здесь есть связанная запись: UITextView не реализует reloadInputViews

Но кажется, что решение (в комментарии) ", по-видимому, объявляет его как UITextView вместо UIResponder, влияет на то, как он себя ведет во время выполнения... и теперь он работает"

В моем случае это UITextField, и я попытался направить на UITextView на всякий случай. Нет.

Я еще раз повторю, что он хорошо работает под iOS7/Xcode5.

Я действительно не знаю, является ли это проблемой "бета" с Xcode 6 или изменением дизайна в iOS 8.

Ответ 1

Я нашел ту же проблему. Лучше проверить, является ли textField уже первымResponder или нет.

[textField reloadInputViews]; // does not work on iOS8 !

if ([textField isFirstResponder]) {
    [textField resignFirstResponder];
    [textField becomeFirstResponder];
}

Не чистый путь, но он работает.

Ответ 2

Я обнаружил, что это работает, когда текстовое поле является первым ответчиком:

[self.textField reloadInputViews];
[self.textField setText:@" "];
[self.textField setText:@""];