objective-c - 在包含多个 NSTextField 的窗口中捕获空格键

标签 objective-c macos cocoa keyboard-events nstextfield

我有一个大窗口,上面有许多 NSTextField 字段,即使任何文本字段具有焦点,我也想拦截空格键,以便随时按空格键将导致单独的操作。

子类化 NSTextField 并覆盖 -keyUp: 允许我检测空格键,但文本字段中仍插入空白。 -keyDown:根本不触发。

对于其他键(例如 Return 和箭头键),我可以使用 control:textView:doCommandBySelector: 委托(delegate)方法,但它不会通过空格键触发。

有很多关于 NSTextView 的建议,但我没有找到关于 NSTextField 的建议。

最佳答案

您是否尝试过添加事件监视器?您可以通过 NSEvent 类方法 addLocalMonitorForEventsMatchingMask(_:handler:) 创建它们 他们会优先处理您指定的事件。在您的情况下,您需要为 keyDown 事件添加一个监视器,然后在关联的 block 中决定如何处理它们。在 block 的末尾,您可以在事件到达时返回该事件,在这种情况下,它将正常运行,您可以吞掉该事件(返回 nil ),或者您可以通过创建一个新的事件对象并返回它。这是一个例子:

// You can add monitors anywhere - I've chosen the AppDelegate for
// this simple example.
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask
                                          handler:^NSEvent * (NSEvent * theEvent) {

          if (theEvent.keyCode == 49) {
              NSLog(@"swallowing spacebar");
              theEvent = nil;

          }

          return theEvent;
    }];
}

关于objective-c - 在包含多个 NSTextField 的窗口中捕获空格键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30626655/

相关文章:

ios - 如何将出生日期 UIDatePicker 添加到 UITextField?

ruby - 如何在 Mac OS 上恢复/System/Library/Frameworks/Ruby.framework/Versions/1.8?

JQuery 函数不适用于 Mac 上的 Chrome,但适用于 Win 7 上的 Chrome 和所有其他浏览器

swift - 如何移动没有 titleBar 且完全充满 webView 的窗口?

ios - 将 "2011-11-04T18:30:49Z"转换为 "MM/dd/yy hh:mm:SS a"格式

iphone - 延迟触摸响应

ios - 使用 NSAttributedString 更改字符串的颜色和字体

ios - 自其他 View 以来,如何更新 UITableViewController?

iphone - Objective C - 在字符串的特定部分添加字符

objective-c - 如何将事件对象添加到 NSMutableArray 并在它们被释放时删除它们?