2

我使用使用 MetalKit 的“游戏”模板在 Xcode 中的 OS X 上创建了一个应用程序。如何处理 keyDown 和 keyUp 等输入事件?我尝试添加

- (void)keyDown:(NSEvent *)theEvent
{
    NSLog( @"Key down\n" );
}

- (void)keyUp:(NSEvent *)theEvent
{
    NSLog( @"Key up\n" );
}

进入 AppDelegate 和 GameViewController 但当我按下一个键时它们不会被调用。

4

4 回答 4

3

对于 Swift 应用程序,将这些添加到您的 MTKView 子类中:

// yes, this MUST be here.
override var acceptsFirstResponder: Bool { 
    return true 
}
override func keyDown(with theEvent: NSEvent) {
    // do something 
}
override func keyUp(with theEvent: NSEvent) {
    // do something 
}
于 2018-07-24T22:25:07.337 回答
2

如果您不使用MetalKit,则需要创建一个作为子类的视图NSView并在其中实现以下方法:

- (void)keyDown:(NSEvent *)theEvent
{
    NSLog(@"onKeyDown Detected; Merry Christmas, by the way.");
}

- (BOOL)acceptsFirstResponder
{
    return YES;
}

但是,如果您正在使用MetalKit,您将执行相同的操作,并在其中的视图子类中实现上述方法MTKView

我在两个版本上都进行了测试;并keyDown在按下键时被调用。

于 2015-12-26T01:40:15.457 回答
2

如前所述:您必须继承 MTKView 并在子类中处理 keyDown。还要记住将 Storyboard 中的视图类从 MTKView 设置为子类。

这是摆脱 MTKView 中那些讨厌的哔哔声的方法(由于未处理的 keyDown)。

但也如评论中所述:如果您将 Storyboard 中的类重置为 MTKView,keyDown 将继续被处理(并且没有哔哔声)。奇怪的。

如果没有按照其中一个答案的建议进行子类化,我从来没有让它工作。在那个阶段你如何获得指向 GameViewController 的指针?

于 2020-02-19T12:39:22.827 回答
0

这是我在 MetalKit 应用程序中没有子类化的情况下获得键盘输入的方法MTKView

keyDown在 GameViewController.mm 中实现:

- (void)keyDown:(NSEvent *)theEvent
{
    NSLog(@"keyDown Detected");
}

- (BOOL)acceptsFirstResponder
{
    return YES;
}

在我的 AppDelegate.m[[ [myViewController view] window ] makeFirstResponder:myViewController];中,我调用applicationDidFinishLaunchingwheremyViewController指向我的 GameViewController 实例。

于 2017-12-25T15:48:34.837 回答