- (void)keyDown :( NSEvent *)事件不起作用

时间:2009-07-01 14:28:01

标签: cocoa keydown

以下是示例代码。

- (void) keyDown: (NSEvent *) event
{
    NSString *chars = [event characters];
    unichar character = [chars characterAtIndex: 0];

    if (character == 27) {
        NSLog (@"ESCAPE!");
    }
} 

我是否需要在InterfaceBuilder中设置任何委托或任何类型的绑定?

帮助赞赏...

2 个答案:

答案 0 :(得分:3)

需要在keyDown子类中重写

NSView,该子类的对象设置为第一响应者。响应者链传递事件,但为了确保获得它,请确保您的对象是第一响应者。

答案 1 :(得分:0)

在cocoa中,只有视图参与此事件的响应者链。所以你应该覆盖一些视图方法。简单的方法是找出哪个视图是您想要处理和使用它的特定事件的第一响应者。

窗口将keyDown(with: )发送给第一响应者,后者可以处理它或传递给响应者链。并非所有观点都能通过事件。 NSCollectionView不传递键事件。它会发出颠簸声。

您要处理的密钥也可能是密钥等效项 read more here。如果是这样,您应该覆盖performKeyEquivalent(with :)方法来接收此类事件。此事件不同于keyDown事件,从窗口传递到所有子视图,直到有人处理它们。

如前所述NSCollectionView keyDown(with :)方法不会将响应事件链中的键事件传递给它。要在其中一个超级视图中处理此类事件,您应首先在集合视图中覆盖它,并通过调用self.nextResponder?.keyDown(with:event)手动发送事件,以便您自己处理此类事件。