Текстовое поле UIAlertView не отображает клавиатуру в iOS8
@implementation
UIAlertView *query;
@end
- (void)viewWillAppear:(BOOL)animated {
query = [[UIAlertView alloc]
initWithTitle:NSLocalizedString(@"New", @"")
message:nil
delegate:self
cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
otherButtonTitles:NSLocalizedString(@"OK", @""), nil];
query.alertViewStyle = UIAlertViewStylePlainTextInput;
UITextField *textField = [_query textFieldAtIndex:0];
textField.placeholder = NSLocalizedString(@"Title", @"placeholder text where user enters name for new playlist");
textField.delegate = self;
[_query show];
}
После того, как отображается UIAlertView
, клавиатура также отображается, а UITextfield
- фокус (он работает только на pre iOS7, но не работает в iOS8). Я пробовал [textfield becomeFirstResponder]
, но это не сработало. Я создаю новый проект и использую cove выше, он работает.
Моя проблема: клавиатура не отображается с помощью стиля UIAlertViewStylePlainTextInput
.
Я не знаю почему? Может ли кто-нибудь мне помочь?
Спасибо.
Ответы
Ответ 1
Этот уродливый хак работал у меня после вызова show:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// HACKHACK: This is to make the keyboard appear in iOS8
UITextRange* textRange = self.textField.selectedTextRange;
[self.textField selectAll:self];
[UIMenuController sharedMenuController].menuVisible = NO;
self.textField.selectedTextRange = textRange;
});
Иди в ту же проблему и потратил часы, играя с UIAlertController, который является "правильным" решением, но, к сожалению, имеет несколько проблем в другом месте (например, он ломается при представлении от popover) и не будет работать с iOS7.
Это определенно ошибка в iOS8. Надеюсь, Apple скоро это исправит. Он, к сожалению, разбивается даже на старые двоичные файлы, скомпилированные для iOS7.
Ответ 2
Здесь небольшое улучшение для Chen Lim hack/fix, которое должно быть помещено в UIAlertViewDelegate:
- (void)didPresentAlertView:(UIAlertView *)alertView {
if (isIOS8) {
// hack alert: fix bug in iOS 8 that prevents text field from appearing
UITextRange *textRange = [[alertView textFieldAtIndex:0] selectedTextRange];
[[alertView textFieldAtIndex:0] selectAll:nil];
[[alertView textFieldAtIndex:0] setSelectedTextRange:textRange];
}
}
(Вам нужно будет реализовать метод isIOS8, свойство или iVar.)
Ответ 3
Это помогает мне устранить все связанные с этим проблемы:
[MyUITextView endEditing:YES];
Поместите его перед показом UIAlertView
.
Ответ 4
В моем случае это происходило, потому что UIViewController
, который представлял UIAlertView
, реализовал canBecomeFirstResponder
с результатом YES, так как я хотел слушать события "shake".
Как только я добавил следующую реализацию метода UIAlertViewDelegate
, клавиатура была представлена как ожидалось:
- (void)willPresentAlertView:(UIAlertView *)alertView
{
[self resignFirstResponder];
}
Таким образом, это может не решить все проблемы с этим так называемым "устаревшим" классом, но проверить, поддерживает ли ваш контроллер поведение первого ответчика.
Ответ 5
Для меня проблема заключалась в том, что текстовое поле уже имело статус первого ответчика, поэтому клавиатура уже была видна при вызове кода предупреждения. Увольнение этого поля устранило проблему.
Ответ 6
Вы видите это на устройстве или просто в симе?
Кажется, что проблема с симулятором iOS8 обнаруживает физическую клавиатуру и не отображает программную клавиатуру. Возможно, это будет преднамеренно, поскольку вы технически используете физическую клавиатуру... это просто не идеальное поведение для тестирования симов.
Попробуйте выполнить команду K, чтобы переключить программную клавиатуру в сима, если это проблема.
Ответ 7
Я столкнулся с такой же ситуацией, и, как я решил эту ошибку, пытается уйти с текущего ответчика перед показом клавиатуры alertView
.And UITextField
, как и ожидалось.
UITextField *textField = ...; // Suppose textField is currently being edited.
[textField resignFirstResponder]; // before showing,resign first.
[_query show];
Ответ 8
На первой странице документации UIAlertView указано:
Примечания к подклассамКласс UIAlertView предназначен для использования как есть и не поддерживает подклассы. Иерархия представления для этого class является закрытым и не должен быть изменен.
Для получения дополнительной информации о конфигурации внешнего вида и поведения см. "Оповещения".
Другими словами, вы не должны возиться с содержимым окна UIAlertView. Фактически это работает в более ранних версиях ОС, чем iOS 8 - это просто бонус. Он устарел с iOS 8.
Что вы хотите сделать в iOS 8, используйте новый класс UIAlertController, который позволяет редактировать текстовые поля.