Ios 按外部键盘上的返回键关闭UIAlertView

Ios 按外部键盘上的返回键关闭UIAlertView,ios,uialertview,Ios,Uialertview,我将显示一个简单的警报视图,如下所示: UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"title" message:@"msg" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; 现在,如果用户连接了外部(蓝牙)键盘,我想在用户键入返回键时关闭警报对话框 我如何做到这一点 这里的挑战是学会按键盘上的任何键。一旦知道了这一点,

我将显示一个简单的警报视图,如下所示:

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"title" message:@"msg" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
现在,如果用户连接了外部(蓝牙)键盘,我想在用户键入返回键时关闭警报对话框

我如何做到这一点

这里的挑战是学会按键盘上的任何键。一旦知道了这一点,取消对话框就很简单了(使用
[UIAlertView dismissWithClickedButtonIndex:…]

我已尝试实现
[UIViewController keyCommands
函数,返回“\r”的处理程序,但这仅在显示主视图时有效,而在显示警报时无效

您可以在此处查看示例项目:


注意:到目前为止,下面两个发布的解决方案通常不起作用,但只有在从
viewdiload
中显示警报时才起作用。不过,当我显示过去的
viewdiload
警报时,我需要它起作用。

以下内容对我有效

首先使用以下命令将处理警报视图的视图控制器设置为第一响应者:

[self becomeFirstResponder];
接下来,请确保覆盖视图控制器上的以下方法:

- (BOOL)canBecomeFirstResponder {
    return YES;
}

-(NSArray *)keyCommands {
    return @[[UIKeyCommand keyCommandWithInput:@"\r" modifierFlags:0 action:@selector(enterPressed)]];
}
然后,在显示警报视图后,由于视图控制器仍然是第一个响应者,因此您只需按下
键即可关闭警报视图:

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

我删除了我的最后一个答案,因为UIAlertView不是第一反应者,让它成为第一反应者是个坏主意(副作用?)

因此,诀窍是创建一个自定义视图,并在alertView显示时将其添加为firstResponder

我把代码放在一个文件夹里

从:

委员会本身:


我认为可以通过直接扩展
UIResponder
,执行单例操作,并在UIAlertView类别中添加自定义构造函数方法来优化解决方案,从而自动执行这些操作。

全局声明alertView

和使用


[alertView使用Clicked按钮解除索引:0动画:是]

你不能使用
文本字段shouldReturn:
?当外部键盘点击return时,这不是调用的吗?全局声明UIAlertView对象,然后dismis。@ScottBerrevoets-你提到的方法是针对文本字段的,并且只针对那些有焦点的字段。就我所知,UIAlertView中没有这样的视图。那么你是如何即时消息的呢再次激活此功能?@ThomasTempelmann:啊,我明白了。我原以为你的警报实际上有一个文本字段,但你想取消一个没有文本字段的警报。如果用户按return,你能使用通知吗?可能在第二个线程上?因为UIAlertView似乎在线程上阻止了一些事情……奇怪的是,我想我已经尝试了你想要的你的建议。我必须仔细检查。我无法让它工作。我有一个视图控制器,我将上面所有的功能都放在其中,它也是UIAlertView的委托。然后我创建并显示警报,但当我按下返回键时,什么都不会被调用。我使用的是错误的视图控制器吗?警报有自己的吗?我该怎么做找到了吗?@ThomasTempelmann:警报有自己的视图控制器。“找到了”不是您想要执行的操作。会对第一响应者调用
keyCommands
方法。显示警报时,视图控制器通常不是第一响应者。但是,您可以在显示警报后将自己设置为第一响应者(在
didPresentAlertView:
)。那么凯文的选择可能对你有用。@ThomasTempelmann如果警报视图未显示,事件是否正确触发?以下内容对我有用,你有一个小测试项目来证明上述不起作用吗?@Scottberrevotes我已经尝试了你的建议,即调用
[self becomeFirstResponder]
在警报的
didPresentAlertView:
回调中。也没有帮助。这是一个有效的解决方案,当然你必须将它适应你的项目。dimissWithClickedButtonIndex应该用
cancelButtonIndex
填充。奇怪的是,你使用的快捷方式使它工作,但它不正确:你的代码只在en警报是从viewDidLoad显示的。但一旦你将其移动到ViewDidDisplay,它就不再显示了。如果我在ViewDidDisplay中的代码中显示警报,它也会工作。因此,我们回到了原点。@ThomasTempelmann有趣的是,我想知道这是否是它对我也起作用的原因。我很确定我只是在我们访问时在viewDidLoad中显示警报LH:我今晚回家后会再进一步调查这件事的。真奇怪,我很好奇为什么它出现后就不起作用了。你还不明白这个问题。
- (void)didPresentAlertView:(UIAlertView *)alertView
{
    [self.keyCommandsView becomeFirstResponder];
}

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

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

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