Закрыть UIAlertView с нажатием клавиши Return на внешней клавиатуре

Я показываю простое предупреждение:

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"title" message:@"msg" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];

Теперь, если у пользователя есть внешняя (bluetooth) клавиатура, прикрепленная, я хочу закрыть диалоговое окно оповещений, если пользователь вводит ключ возврата.

Как это сделать?

Задача здесь - узнать о нажатии любой клавиши на клавиатуре. Как только это известно, отклонение диалога тривиально (с [UIAlertView dismissWithClickedButtonIndex:...]).

Я попытался реализовать функцию [UIViewController keyCommands, возвращая обработчик для "\ r", но это работает только тогда, когда отображается мой основной вид, а не пока отображается предупреждение.

Здесь вы можете посмотреть пример проекта: https://github.com/tempelmann/AlertViewReturnKeyDismissal

Примечание. До сих пор два опубликованных решения ниже НЕ работают вообще, но только если предупреждение отображается в пределах viewDidLoad. Мне нужно, чтобы это работало, когда я показываю предупреждение viewDidLoad.

Ответ 1

Следующие работали для меня...

Сначала установите контроллер представления, который обрабатывает вид предупреждения для первого ответчика с помощью:

[self becomeFirstResponder];

Далее не забудьте переопределить следующие методы на вашем контроллере:

- (BOOL)canBecomeFirstResponder {
    return YES;
}

-(NSArray *)keyCommands {
    return @[[UIKeyCommand keyCommandWithInput:@"\r" modifierFlags:0 action:@selector(enterPressed)]];
}

Затем, после отображения вашего предупреждения, поскольку контроллер просмотра по-прежнему будет первым ответчиком, вы можете просто отключить метод enterPressed для просмотра предупреждений:

-(void)enterPressed {
    [self.alert dismissWithClickedButtonIndex:0 animated:YES];
}

Ответ 2

Я удаляю свой последний ответ, поскольку UIAlertView не был первымResponder, и было плохой идеей сделать его firstResponder (побочные эффекты?).

Итак, трюк заключается в создании пользовательского представления и его добавлении как firstResponder, когда отображается alertView.

Я помещаю код в github repo.

Из ViewController:

- (void)didPresentAlertView:(UIAlertView *)alertView
{
    [self.keyCommandsView becomeFirstResponder];
}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    [self.keyCommandsView resignFirstResponder];
}

KeyCommandsView:

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

-(NSArray *)keyCommands {
    return @[[UIKeyCommand keyCommandWithInput:@"\r" modifierFlags:0 action:@selector(enterPressed)]];
}

- (void)enterPressed
{
    [self.alertView dismissWithClickedButtonIndex:0 animated:YES];
}

Я думаю, что решение можно было бы оптимизировать, расширив непосредственно UIResponder, выполнив одноэлемент и добавив в класс UIAlertView специальный метод конструктора для автоматического выполнения этого материала.

Ответ 3

Объявить alertView глобально.

и используйте

[alertView rejectWithClickedButtonIndex: 0 анимированный: ДА];