Как работать с клавишами-модификаторами в приложении Cocoa menubar - PullRequest
0 голосов
/ 02 мая 2019

Итак, у меня есть приложение панели меню с ползунком внутри пользовательского представления: я хочу, чтобы при перетаскивании кнопки можно было нажимать клавишу опций, чтобы ползунок привязывался к приращениям.

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

  1. NSEvent.addGlobalMonitorForEvents

    • "Обратите внимание, что ваш обработчик не будет вызываться для событий, отправляемых в ваше собственное приложение."
  2. NSEvent.addLocalMonitorForEvents

    • " Ваш обработчик не будет вызываться для событий, которые используются вложенными циклами отслеживания событий, такими как отслеживание элементов управления, отслеживание меню или перетаскивание окна "
  3. NSApplication.shared.currentEvent

    • Это не работает, поскольку событие flagsChangedне обрабатывается приложением, поэтому это значение установлено на другое значение (нажатие кнопки мыши).
  4. flagsChanged(with event: NSEvent)

    • Этоне звонят.Я установил viewController на acceptFirstResponder, а также оставил первый респондент представления.Кроме того, я вложил в подкласс представление и переопределил flagsChanged, и это не сработало.
  5. Я попытался создать пункт меню, который имеет клавишу типа "s""или" p ", чтобы вызвать действие.Но когда срабатывает «действие», строка меню скрывается ...

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

1 Ответ

1 голос
/ 02 мая 2019

В методе mouseDragged вашего пользовательского слайдера вы просто проверите параметр modifierFlags параметра NSEvent, чтобы увидеть, содержит ли он ключ опции.

-

Поскольку можно было бы истолковать, что ползунок является фактическим NSSlider, в этом случае управление ползунком действительно реализуется с помощью NSSliderCell, и отслеживание мыши передается из представления в ячейку внутри mouseDown, поэтому MouseDragged NSSlider не будет вызываться, и вместо этого вам придется работать в методе trackMouse:inRect:... ячейки. Но если вы используете NSSlider, то вы, вероятно, просто захотите использовать altIncrementValue.

...