Закрыть 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 анимированный: ДА];