Как работать с клавишами-модификаторами в приложении строки меню Какао

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

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

  1. NSEvent.addGlobalMonitorForEvents

    • "Note that your handler will not be called for events that are sent to your own application."
  2. NSEvent.addLocalMonitorForEvents

    • "Your handler will not be called for events that are consumed by nested event-tracking loops such as control tracking, menu tracking, or window dragging"
  3. NSApplication.shared.currentEvent

    • This dosesn't work because the flagsChanged event isn't handled by the app, so this value is set to another value (mouse button presses).
  4. flagsChanged(with event: NSEvent)

    • This doesn't get called. I've set the viewController to acceptFirstResponder as well as resigned the first responder of the view. Also, I've subclassed the view and overridden flagsChanged and that hasn't worked.
  5. Я пробовал создать пункт меню с такими клавишами, как «s» или «p», для запуска действия. Но когда срабатывает "действие", строка меню скрывается ...

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


person Josh Grant    schedule 02.05.2019    source источник
comment
Можете ли вы использовать modifierFlags NSEvent в действии меню или вам действительно нужно уведомление?   -  person red_menace    schedule 02.05.2019


Ответы (1)


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

--

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

person seth    schedule 02.05.2019
comment
Слайдер на самом деле не был NSSlider. Оказалось, что развертывание моего настраиваемого элемента управления не было хорошей идеей. После создания подклассов это работало намного лучше, и я мог использовать клавиши-модификаторы. Спасибо за совет. - person Josh Grant; 04.07.2019