Текстовое поле 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, который позволяет редактировать текстовые поля.