版权声明:原文为CSDN博主「哈尔滨的酸柠檬」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_31177681/article/details/81080644
摘要:在开发MAC应用时,现在新版本的Xcode搭建界面大多都是在ViewController上,而非NSWindow。当应用程序运行时,按下键盘上的按键不会经过keyDown这个方法。#import"ViewController.h"@implementationViewController-(void)keyDown:(NSEvent*)event{NSLog(@"%hu",event.keyCode);}@end这涉及到响应者链的问题。
在开发MAC应用时,现在新版本的Xcode搭建界面大多都是在ViewController上,而非NSWindow。当应用程序运行时,按下键盘上的按键不会经过keyDown这个方法。
-(void)awakeFromNib {
[NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskKeyDown handler:^NSEvent * _Nullable(NSEvent * _Nonnull aEvent) {
[self keyDown:aEvent];
return aEvent;
}];
[NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskFlagsChanged handler:^NSEvent * _Nullable(NSEvent * _Nonnull aEvent) {
[self flagsChanged:aEvent];
return aEvent;
}];
}
这涉及到响应者链的问题。如何才能在ViewController中获取键盘事件呢?可以在-(void)awakeFromNib中添加如下代码
oc版本:
#import "ViewController.h"
@implementation ViewController
-(void)keyDown:(NSEvent *)event{
NSLog(@"%hu",event.keyCode);
}
@end
Swift3.0版本:
override func awakeFromNib() {
NSEvent.addLocalMonitorForEvents(matching: .keyDown) { (aEvent) -> NSEvent? in
self.keyDown(with: aEvent)
return aEvent
}
NSEvent.addLocalMonitorForEvents(matching: .flagsChanged) { (aEvent) -> NSEvent? in
self.keyDown(with: aEvent)
return aEvent
}
}
然后再运行程序便可以接收keyDown事件。