我有一个大窗口,上面有许多NSTextField
字段,即使任何文本字段都有焦点,我也想截取空格键,这样任何时候按空格都会导致分开行动。
子类化NSTextField
并覆盖-keyUp:
允许我检测空格键,但仍在文本字段中插入空白。 -keyDown:
根本不会发射。
对于其他键,如Return和箭头键,我可以使用control:textView:doCommandBySelector:
委托方法,但不会使用空格键触发。
NSTextView
有很多建议,但我找不到NSTextField
。
答案 0 :(得分:1)
由于您尝试实施的行为位于窗口级别(或者可能是所有文本字段的祖先视图),因此您应该考虑实施-performKeyEquivalent:
在该级别,而不是尝试捕获每个单独的文本字段中的空格键。
在您的实现中,检查事件的modifierFlags
以确保没有按下控件,选项或命令(假设您只想处理未修改的空格键按下)以及它的{{1 }等于charactersIgnoringModifiers
。如果是,请执行您想要的操作,然后返回@" "
以表明您已处理过该重要事件。否则,请返回YES
以允许正常处理。
答案 1 :(得分:1)
您是否尝试过添加事件监视器?您可以通过NSEvent
类方法addLocalMonitorForEventsMatchingMask(_:handler:)
创建它们,它们会为您指定的事件提供第一个dib。在您的情况下,您需要为keyDown
个事件添加一个监视器,然后在相关的块中决定如何处理它们。在块结束时,您可以在事件到达时返回事件,在这种情况下它将正常运行,您可以吞下事件(返回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;
}];
}
答案 2 :(得分:0)
如果您知道如何为NSTextView
执行此操作,那么您知道如何为NSTextField
执行此操作,因为NSTextField
使用名为“字段编辑器”的NSTextView
用于编辑。你可以像这样得到窗口的默认字段编辑器:
NSTextView* fieldEd = [myWindow fieldEditor: YES forObject: nil];
您还可以使用窗口委托来提供自定义字段编辑器。
答案 3 :(得分:-1)
所以你可能想看一下ReactiveCocoa
转到此page上的视频,然后查看 5:14 ,查看类似于您喜欢的内容。
ReactiveCocoa可以挂钩到您的所有文本字段中,然后只要空间被击中,信号处理程序就可以将其拾取。 (但是,可能比你想要的更多)。