我正在学习如何使用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;
}
}
}
答案 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并覆盖其事件处理方法。
Dalrymple的什么是开始学习的好书 MacOS编程?
Learn Objective-C on the Mac非常简单,涵盖了足够的基础知识并且移动速度足以让你在短时间内离开地面。它涵盖了从Xcode和Interface Builder到OOP和Objective-C实践的所有内容。对初学者(IMHO)特别有用的是源文件组织和基础套件章节。
祝你好运!