我正在尝试将键盘快捷键添加到我的应用中,但是我遇到了无法调用UIKeyCommand的问题。
我有一个覆盖了KeyCommands的UIViewController。
- (BOOL)becomeFirstResponder
{
return YES;
}
- (NSArray<UIKeyCommand *> *)keyCommands
{
return self.keyCommandManager.keyShortcutsArray;
}
我还有一个NSObject的KeyCommandManager类,该类有两种方法,一种根据我的应用程序的状态设置keyShortcutsArray,另一种是应该由UIKeyCommands触发的方法。
- (void)setKeyShortcutsOfType:(ShortcutType)shortcutType
{
switch(shortcutType)
{
case PlaybackPreviewShortcut:
self.keyShortcutsArray = @[[UIKeyCommand keyCommandWithInput:@" " modifierFlags:0 action:@selector(keyShortcutActions:) discoverabilityTitle:@"Toggle playback preview"]];
break;
default:
self.keyShortcutsArray = @[];
break;
}
- (void)keyShortcutActions:(UIKeyCommand)sender
{
NSLog(@"#### This method is not being called by the space key shortcut");
}
当前,当按下某个键时,KeyCommand重写方法将获取正确的数组。但是这些键的选择器不起作用,keyShortcutActions
方法也没有被调用。
答案 0 :(得分:1)
来自Apple的docs:
从此方法返回的关键命令将应用于整个响应者链。当按下与键盘命令对象匹配的组合键时,UIKit会沿着响应者链移动,以寻找实现相应操作方法的对象。它在找到的第一个对象上调用该方法,然后停止处理事件。
您的nomips16
的{{1}}实例在响应者链中是 not -视图控制器是
如果您使用此方法:
keyCommandManger
您应该看到它被触发了。
如果您希望将“操作”代码包含在NSObject
中,则可以将事件转发到manager对象。或者,您可以尝试将经理类更改为继承自- (void)keyShortcutActions:(UIKeyCommand)sender
{
NSLog(@"#### This method IS being called (in view controller) by the space key shortcut");
}
,但是可靠地将其纳入链条是困难的部分。