Я успешно реагирую на события клавиатуры через метод keyDown: мой оконный контроллер.
Проблема возникает при выполнении перетаскивания мышью:
События клавиатуры, похоже, отложены и будут стрелять только по мыши.Какао: при перетаскивании событий клавиатуры не будет срабатывать (NSEventTrackingRunLoopMode)
Чтобы было ясно, что я имею в виду:
• место журнал заявление в KeyDown вы контроллера оконного: (. На NSSlider для экс) метод
• запустить приложение, выполнить некоторые операции перетаскивания
• время поддерживая перетаскивание, нажмите любую клавишу: ничего не записывается на консоль.
• разблокировка: журналы появляются, yay ...
Управление, которое я перетаскиваю, является обычным NSSlider.
Я реализовал механизм перетаскивания, используя подход «Mouse-Tracking Loop». , что я понимаю, при перетаскивании основной режим цикла NSApplication переключается на NSEventTrackingRunLoopMode, тем самым ограничивая входящие события.
Итак, я просто добавил NSKeyDownMask & NSKeyUpMask в мой цикл отслеживания и при запуске, называемый self.nextResponder keyDown/up: метод соответственно. Моя проблема решена для этого конкретного пользовательского подкласса.
А как насчет контроля на какао? Я не могу закодировать это исключение ...
Я надеялся на «addLocalMonitorForEventsMatchingMask:» NSEvent по методу , но, увы, говорит доктор: «не будет вызываться для событий, которые потребляются вложенными события отслеживания петель, такие как управление отслеживание, отслеживание меню или перетаскивание окна ».
Итак, нет ли простого решения для приема клавиатурных событий независимо от режима runloop приложения?
У меня есть аналогичная проблема в том, что таймеры, похоже, не срабатывают, когда я использую подход «Mouse-Tracking Loop» - независимо от того, какой режим цикла запуска я добавляю. Таймеры срабатывают, когда меню верхнего уровня сбрасывается ... - так какой-то прогресс в этом? –