KeyDown и образец какао - PullRequest
5 голосов
/ 17 июля 2009

Я учусь создавать программы с Какао. Я использую пример приложения Apple, которое записывает видео с веб-камеры. Я хотел бы начать и остановить видео, фиксируя нажатие клавиши. Я попытался переопределить событие keydown, но я прочитал, что это невозможно в NSObject. Как я могу справиться с такого рода событиями?

Класс приложения расширяет класс NSObject.

Это код:

- (void)keyDown:(NSEvent *)event {
  NSLog(@"Hi there");
  NSString *characters = [event characters];
  if ([characters length]) {
    switch ([characters characterAtIndex:0]) {
      case NSUpArrowFunctionKey:
      NSLog(@"Key UP");
      break;
    }
  }
}

Ответы [ 3 ]

7 голосов
/ 17 июля 2009

Я пытался переопределить событие Keydown, но я читал, что это невозможно в NSObject.

Правильно. Только респондент может отвечать на события.

Как я могу справиться с такого рода событиями?

Реализация респондента. Подклассы NSWindow или NSWindowController будут работать. Убедитесь, что ваш фактический оконный или оконный контроллер является экземпляром вашего подкласса.

Документация по Какао объясняет далее.

Класс приложения расширяет класс NSObject.

Почему? Как правило, основным классом комплекта приложений является NSApplication или его подкласс, и для создания подкласса NSApplication не так много веских причин.

PS: Какая очень хорошая книга для начинающих изучать программирование на MacOS?

Я сам не учился по книге Хиллегаса (я придерживался документации Apple), но это очень популярная рекомендация, и я прочитал ее и могу сказать, что это хорошо.

4 голосов
/ 06 декабря 2009

Подклассы NSWindow или NSWindowController будет работать.

Аналогично, вы можете создать подкласс NSView и переопределить его методы обработки событий.

Какая очень хорошая книга, чтобы начать учиться Программирование MacOS?

Learn Objective-C на Mac от Dalrymple действительно прост, охватывает достаточно основ и движется достаточно быстро, чтобы в короткие сроки оторваться от земли. Он затрагивает все, от Xcode и Interface Builder до практик ООП и Objective-C. Особенно полезны для начинающих (ИМХО) главы об организации исходного файла и главах об основах.

Удачи!

4 голосов
/ 18 июля 2009

Из Руководства по обработке событий Какао - Цепочка респондента :

Цепочка респондента представляет собой связанную серию объектов респондента, к которым применяется сообщение о событии или действии. Когда данный объект респондента не обрабатывает конкретное сообщение, объект передает сообщение своему преемнику в цепочке (то есть своему следующему респонденту).

Когда вы нажимаете клавишу, окно получает событие keyDown. Затем он отправляет событие первому респонденту , который обычно представляет собой элемент управления с синей рамкой вокруг границы (попробуйте щелкнуть поле адреса в Safari или Firefox, когда оно синего цвета, а затем сначала -ответчик).

Если первый респондент не ест нажатие клавиши (поле адреса Safari действительно съедает его, когда отображается символ), то он передает его по цепочке респондента на следующий респондент в иерархии представления, затем к окну и к контроллеру окна, как вы можете видеть в Guide . (Позаботьтесь о том, чтобы ответчик был другой историей.)

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

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

...