UIKeyCommand действие не вызывается - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь добавить сочетания клавиш в свое приложение, и у меня возникла проблема с тем, что действие UIKeyCommand не вызывается.

Я получил UIViewController, который переопределяет KeyCommands.

- (BOOL)becomeFirstResponder
{
return YES;
}

- (NSArray<UIKeyCommand *> *)keyCommands
{
return self.keyCommandManager.keyShortcutsArray;
}

У меня также есть класс KeyCommandManager NSObject, который имеет два метода, один из которых устанавливает 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 Ответ

1 голос
/ 13 марта 2019

Из документов Apple :

Ключевые команды, которые вы возвращаете из этого метода, применяются ко всей цепочке респондента.Когда нажата комбинация клавиш, соответствующая объекту команды клавиш, UIKit обходит цепочку респондента в поисках объекта, который реализует соответствующий метод действия.Он вызывает этот метод для первого найденного объекта, а затем останавливает обработку события.

Ваш keyCommandManger экземпляр NSObject равен , а не в цепочке респондента -Контроллер вида.

Если вы введете этот метод:

- (void)keyShortcutActions:(UIKeyCommand)sender
{
    NSLog(@"#### This method IS being called (in view controller) by the space key shortcut");
}

, вы должны увидеть, что он срабатывает.

Если вы хотите, чтобы ваш код "действия" содержался вkeyCommandManger, вы можете переслать событие вашему менеджеру.Или вы можете попытаться изменить свой класс менеджера для наследования от UIResponder, но надежное получение его в цепочке - сложная часть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...