未调用UIKeyCommand操作

时间:2019-03-13 14:33:10

标签: ios objective-c

我正在尝试将键盘快捷键添加到我的应用中,但是我遇到了无法调用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方法也没有被调用。

1 个答案:

答案 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"); } ,但是可靠地将其纳入链条是困难的部分。