在包含多个NSTextField

时间:2015-06-03 17:18:16

标签: objective-c macos cocoa keyboard-events nstextfield

我有一个大窗口,上面有许多NSTextField字段,即使任何文本字段都有焦点,我也想截取空格键,这样任何时候按空格都会导致分开行动。

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

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

NSTextView有很多建议,但我找不到NSTextField

4 个答案:

答案 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可以挂钩到您的所有文本字段中,然后只要空间被击中,信号处理程序就可以将其拾取。 (但是,可能比你想要的更多)。