2014-08-29 4 views
16
@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 является фокусом (Он просто работает на заранее iOS7, но не работает в iOS8). Я пробовал [textfield becomeFirstResponder], но это не сработало. Я создаю новый проект и использую cove выше, он работает.UIAlertView не показывает клавиатуру в iOS8

Моя проблема: клавиатура не показана с UIAlertViewStylePlainTextInput стилем.

Я не знаю почему? Может ли кто-нибудь мне помочь? Спасибо.

ответ

9

Это некрасиво хак работал для меня, после вызова шоу:

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.

+0

Спасибо за ваше время. С версией выпуска GM xCode в первый раз отображается UIAlertView, но клавиатура не отображается. Во второй раз и позже он всегда показывает клавиатуру. Я думаю, что это ошибка Apple. Я попробую, как ваше предложение. Еще раз спасибо. – nmh

+0

Спасибо большое :) – sum2000

-2

The first page of the UIAlertView documentation состояние:

подклассы Примечание предназначен класс UIAlertView использоваться как есть и не поддерживают подклассы. Иерархия представления для этого класса является частной и ее нельзя изменять.

Для получения дополнительной информации о конфигурации внешнего вида и поведения см. «Оповещения».

Другими словами, вы не должны возиться с содержимым окна UIAlertView. Фактически это работает в более ранних версиях ОС, чем iOS 8 - это просто бонус. Он устарел от iOS 8.

Что вы хотите сделать в iOS 8, это использование brand new UIAlertController class, что позволяет редактировать текстовые поля.

+2

Как это подклассы? Это простой старый способ доступа к 'textField (s)' 'UIAlertView'', если я не пропущу что-то. – n00bProgrammer

+0

@ Майкл Даутерманн: Спасибо за ваш ответ. Моя проблема заключается в том, что клавиатура не отображается автоматически, когда я показываю UIAlertView со стилем «UIAlertViewStylePlainTextInput»? Я удаляю код, который получает текстовое поле alertview, но не отображает клавиатуру. У вас есть какие-нибудь предложения для меня? – nmh

+0

Это потому, что представления в UIAlertView предназначены для использования в режиме приватности и только для чтения. Тот факт, что приложения уходят с возиться с ним, означает, что все может (и в случае O.P. они *** делают ***) ломаются между крупными релизами iOS. –

17

Вот небольшое улучшение Чен Лим хак/исправить, чтобы быть помещены в 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, свойство или Ивар.)

+0

Большое вам спасибо за ваше время, чтобы ответить на мой вопрос. – nmh

+4

Просто выполнение [tf selectAll: nil] в этом методе, похоже, делает трюк. Работает как для 7.1, так и для 8.1. –

+0

Он разбивает 'UITextView' размером, вызывая уведомления на клавиатуре во второй раз, не скрываясь. – Dmitry

0

Для меня проблема заключалась в том, что текстовое поле уже имело статус первого ответчика, поэтому клавиатура уже была видна при вызове кода предупреждения. Устранение этого вопроса устранило проблему.

0

Вы видите это на устройстве или просто в симе?

Существует проблема с симулятором iOS8, где он обнаруживает физическую клавиатуру и не отображает программную клавиатуру. Возможно, это будет преднамеренно, поскольку вы технически используете физическую клавиатуру ... это просто не идеальное поведение для тестирования симов.

Попробуйте команду K, чтобы переключить программную клавиатуру в сима, если это ваша проблема.

3

Это помогает мне решить все связанные с этим вопросы:

[MyUITextView endEditing:YES]; 

Положите его перед показом UIAlertView.

+0

Спасибо, это действительно РЕШЕНИЕ! – k06a

2

В моем случае это происходило, потому что UIViewController, который представлял UIAlertView, реализовал canBecomeFirstResponder с результатом ДА, так как я хотел слушать события «встряхивания».

Как только я добавил следующую реализацию метода UIAlertViewDelegate клавиатура была представлена, как и ожидалось:

- (void)willPresentAlertView:(UIAlertView *)alertView 
{ 
    [self resignFirstResponder]; 
} 

Так что это не может решить все проблемы, с так называемой «устаревшей» класса, но это что-то чтобы проверить, поддерживает ли ваш контроллер поведение первого ответчика.

0

Я пришел с такой же ситуацией, и, как я решил эту ошибку, пытается уйти с текущего ответчика перед тем, как показать alertView. И клавиатура UITextField появляется, как и ожидалось.

UITextField *textField = ...; // Suppose textField is currently being edited. 
[textField resignFirstResponder]; // before showing,resign first. 

[_query show]; 
Смежные вопросы