连接外部键盘时支持命令,控制和箭头键

Peq*_*qNP 2 keyboard objective-c ios

我有一个iOS应用程序,我想要做的就是提供更多支持基本命令键组合,如命令+ a,命令+ s,命令+ x,命令+ v和朋友,当用户连接蓝牙键盘时.

我知道这是可能的.Textastic等应用程序和许多其他编辑应用程序都支持这些功能.

我查看了UIResponder(它似乎只用于弹出菜单),UIKeyInput,UITextInput [Delegate]和其他API文档,但没有参考如何执行此操作.

这是很容易支持哪些选项是使用(BOOL)canPerformAction显示在UIMenuController:(SEL)动作withSender:(ID)发送者.但是,当连接蓝牙键盘时,似乎不会调用此方法.所以我要么专门为键盘或其他东西实现另一种方法.

我现在怀疑文本子系统可能负责执行操作.但是,没有我能找到的文件!此外,执行操作时不会调用任何UITextInput委托方法.我几乎认为解决方案是私有的,我需要特别询问Apple如何访问这些功能(我刚刚完成).

更新:

positionFromPosition:inDirection:offset:是用于检测何时按下箭头键的方法.在iOS调用此方法之后,它调用setSelectedText:.你需要解决剩下的管道问题.

更新2:

我能够回答所有问题.请参阅标记的解决方案以获取答案.

Peq*_*qNP 5

弄清楚了.我已经实现了UIMenuController方法来支持剪切,复制和粘贴.通过实现这些功能并将蓝牙键盘连接到物理设备,您将自动获得基本命令选项(a,c,x,v和朋友).您需要完全实现UIMenuController UIResponderStandardEditActions.我想要注意的是,在iOS模拟器中它不会触发命令(a,c,x,v和friends)动作.只有当蓝牙键盘连接到物理设备时,我才能观察到这些功能- 即使在模拟器中启用了"模拟硬件键盘".

关于控制/选项键; 当您完全实现UITextInput时,您还将获得使用箭头键,箭头键+控件,箭头键+选项等时的所有移动功能.查看Apple提供的SimpleTextInput示例代码文件,以便更好地了解如何实现此功能.

话虽如此,您无法创建自己的键盘组合.如果我想要这些功能,Apple会让我为它创建一张票,我不这样做......我真的不在乎支持他们所提供的东西.因此,目前无法执行Command + s(保存)等命令.

一个有趣的小故事; Apple说我想做的事情不可能(使用命令+ c,命令+ v等)与API.我想这表明你对他们的技术专长有何帮助.非常令人失望.

更新:

从iOS 7开始,Apple已经完成了捕获任何关键命令,esc等的简单操作.以下是一个如何捕获各种不同键的示例:

return @[[UIKeyCommand keyCommandWithInput:UIKeyInputEscape modifierFlags:0 action:@selector(escapeKeyPressed:)],
         [UIKeyCommand keyCommandWithInput:@"f" modifierFlags:UIKeyModifierCommand action:@selector(commandFindPressed:)],
         [UIKeyCommand keyCommandWithInput:@"s" modifierFlags:UIKeyModifierCommand action:@selector(commandSavePressed:)],
         [UIKeyCommand keyCommandWithInput:@"b" modifierFlags:UIKeyModifierControl action:@selector(controlBKeyPressed:)],
         [UIKeyCommand keyCommandWithInput:@"f" modifierFlags:UIKeyModifierControl action:@selector(controlFKeyPressed:)],
         [UIKeyCommand keyCommandWithInput:@"r" modifierFlags:UIKeyModifierControl action:@selector(controlRKeyPressed:)]
         ];
...

- (void)commandSavePressed:(UIKeyCommand *)keyCommand
{
    [self saveFile];
}
Run Code Online (Sandbox Code Playgroud)