Mac OS开发 NSViewController获取键盘响应事件

  • 摘要:在开发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事件。

分享:

扫一扫在手机阅读、分享本文

评论