2

下面是示例代码。

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

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

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

帮助赞赏...

4

2 回答 2

3

keyDown需要在NSView其对象设置为第一响应者的子类中被覆盖。响应者链应该传递事件,但要确保您得到它,请确保您的对象是第一响应者。

于 2009-07-01T14:40:36.487 回答
0

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

窗口直接发送keyDown(with: )给可以处理它的第一响应者或传递给响应者链。并非所有视图都会传递事件。NSCollectionView 不传递关键事件。它会播放撞击声。

您要处理的密钥也可能是等效的密钥, 请在此处阅读更多信息。如果是这样,您应该重写 performKeyEquivalent(with: ) 方法来接收这种类型的事件。此事件与 keyDown 事件不同,它从窗口传递到所有子视图,直到有人处理它们。

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

于 2018-02-28T19:48:25.923 回答