23

我试图弄清楚如何检测在连接到 iOS 设备的蓝牙键盘上是否按下了 Escape(以及其他组合键,如 Ctrl 和 alt)。

一些答案似乎表明这是不可能的。但是,Appstore 中有一些应用程序可以执行此操作(例如 iSSH),因此我认为可以以某种方式使用公共 API。

我已经尝试创建自己的 UITextInput 但是当按下 Escape 键时它什么也没有收到。我可以看到 iPad 可能响应的 API 的唯一部分是启用 VoiceOver 时(Escape 就像在 Safari 中一样工作),所以我想知道是否有办法通过辅助功能 API 进入?

我还尝试查看是否可以从 NSNotificationCenter 观察到一些可能有帮助的东西,但还没有找到任何东西。

欢迎提出建议,我已经为此苦苦挣扎了一天,现在我有点不知所措。

4

3 回答 3

17

您现在可以在 iOS 7 中执行此操作。例如,要实现转义键,请覆盖 UITextView 并将以下方法放在您的类中:

- (NSArray *) keyCommands {
    UIKeyCommand *esc = [UIKeyCommand keyCommandWithInput: UIKeyInputEscape modifierFlags: 0 action: @selector(esc:)];
    return [[NSArray alloc] initWithObjects: esc, nil];
}

- (void) esc: (UIKeyCommand *) keyCommand {
    // Your custom code goes here.
}

您无需检查以确保您使用的是 iOS 7,因为早期版本的操作系统不会调用 keyCommands 方法。

于 2014-01-03T19:38:19.457 回答
6

您打算完成的工作没有公共 API,因此这可能会导致拒绝。

如果你愿意冒险,你可以试试这个。Wich 基本上通过覆盖sendEvent:您的UIApplication.

于 2013-02-18T16:26:49.023 回答
5

AFAIK 使用公共 API 是不可能的。我做了一些搜索,但esc无法识别密钥。我唯一没有做的就是尝试iSSH(花费 9 欧元 :-),但是如果您阅读 AppStore 上的说明,很明显ESC硬件(蓝牙)键盘上的键不起作用:

  • 详尽的密钥配置支持。有arrow键(通过弹出窗口或工具栏)。ctrl, alt, esc, tab, shift,Fn键 ( 1-10),`键, PgUp,PgDown和为那些未列出的键提供了多种添加方式。

  • 通过服务器或终端中的选项键映射,蓝牙键盘支持arrow键、function键和键的重新映射。启用后,+按下映射到等效的+按下。ctrlX11/VNCOptionkeyCtrlkey

如您所见,在第二行ESC中没有提到密钥。此外,我发现了这个(旧)帖子

编辑:

作为您的最后一次更新,我找到了一种“隐藏”_gsEvent二进制文件内部的方法。但是,我不知道 Apple 静态分析器是否可以找到它。诀窍很简单……_gsEvent在运行时创建选择器(和其他私有选择器)!

-(void)sendEvent:(UIEvent *)event
{

    SEL aSelector = NSSelectorFromString([self theSelector]);
    if ([event respondsToSelector:aSelector]) {

        NSLog(@"Event: %@", event.description);
    }

    [super sendEvent:event];
}

-(NSString *)theSelector
{
    // compose the keyword as you prefer
    NSString *sel = [NSString stringWithFormat:@"%@g%@%@ent", @"_", @"s", @"Ev"];
    return sel;
}

我尝试在二进制文件中搜索,但没有找到_gsEvent关键字,显然是因为它仅在运行时创建。
希望这可以帮助。

于 2013-02-18T16:30:52.213 回答