KeyDown和Cocoa示例

时间:2009-07-17 15:04:11

标签: cocoa osx-leopard

我正在学习如何使用Cocoa构建程序。我正在使用一个样本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 个答案:

答案 0 :(得分:7)

  

我试图覆盖Keydown事件,但我已经读过,这在NSObject中是不可能的。

正确。只有响应者才能响应事件。

  

我该如何处理这类事件?

实施响应者。子类化NSWindow或NSWindowController将起作用。确保将实际的窗口或窗口控制器作为子类的实例。

Cocoa文档进一步解释。

  

应用程序类扩展了NSObject类。

为什么呢?通常,应用程序包的主要类是NSApplication或它的子类 - 并且没有很多很好的理由来继承NSApplication。

  

PS:开始学习MacOS编程是一本非常好的书吗?

我没有通过Hillegass的书来学习,我自己(我坚持使用Apple的文档),但这是一个非常受欢迎的推荐,我已经阅读了它并且可以告诉你它很好。

答案 1 :(得分:4)

来自Cocoa Event-Handling Guide - The Responder Chain

  

响应者链是一系列响应者对象,应用了事件或操作消息。当给定的响应者对象不处理特定的消息时,该对象将消息传递给链中的后继者(即其下一个响应者)。

当您按某个键时,窗口会收到keyDown事件。然后它将事件发送到第一响应者,这通常是控制,其边框周围有一个蓝色边框(尝试点击Safari或Firefox中的地址字段,当它是蓝色的bezeled然后它有第一响应者状态。

如果第一个响应者没有按键(Safari地址字段在显示字符时确实吃了它),那么它会将它从响应者链传递到下一个响应者在视图层次结构中,然后到窗口和窗口控制器,如Guide中所示。 (注意动作响应者是另一个故事。)

所以你必须在窗口或窗口本身的视图上实现keyDown:如果它没有吃掉事件的视图。最简单的测试方法是覆盖空窗口的keyDown:方法

要将手放入内部工作区,您甚至可以尝试覆盖窗口的sendEvent:方法。 sendEvent:将事件调度到窗口的视图,然后从那里可以记录窗口管理的所有事件。

答案 2 :(得分:4)

  

对NSWindow或   NSWindowController将起作用。

类似地,您可以继承NSView并覆盖其事件处理方法。

  

什么是开始学习的好书   MacOS编程?

Dalrymple的

Learn Objective-C on the Mac非常简单,涵盖了足够的基础知识并且移动速度足以让你在短时间内离开地面。它涵盖了从Xcode和Interface Builder到OOP和Objective-C实践的所有内容。对初学者(IMHO)特别有用的是源文件组织和基础套件章节。

祝你好运!