5

我正在学习如何使用 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;
    }
  }
}
4

3 回答 3

7

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

正确的。只有响应者可以响应事件。

我该如何处理这种事件?

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

Cocoa 文档进一步解释。

应用程序类扩展了一个 NSObject 类。

为什么?通常,应用程序包的主要类是 NSApplication 或它的子类——并且没有太多充分的理由将 NSApplication 子类化。

PS:有什么很好的入门学习MacOS编程的书?

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

于 2009-07-17T15:13:12.097 回答
4

来自Cocoa 事件处理指南 - 响应者链

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

当您按下某个键时,窗口会收到 keyDown 事件。然后它将事件分派给第一响应者,通常是其边框周围带有蓝色边框的控件(尝试单击 Safari 或 Firefox 中的地址字段,当它是蓝色边框时,它具有第一响应者状态)。

如果第一个响应者没有吃掉按键(Safari 地址字段在显示字符时确实吃掉了它),那么它将沿着响应者链传递给视图层次结构中的下一个响应者,然后传递给窗口和窗口控制器,如下所示你可以在指南中看到。(注意动作响应者是另一回事。)

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

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

于 2009-07-17T23:29:12.220 回答
4

子类化 NSWindow 或 NSWindowController 将起作用。

同样,您可以继承 NSView 并覆盖其事件处理方法。

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

Dalrymple的在 Mac 上学习 Objective-C非常简单,涵盖了足够的基础知识,并且移动速度足够快,可以让您在短时间内开始学习。它涉及从 Xcode 和 Interface Builder 到 OOP 和 Objective-C 实践的所有内容。对初学者(恕我直言)特别有帮助的是源文件组织和基础工具包章节。

祝你好运!

于 2009-12-06T10:19:15.250 回答