NSView - (void)keyDown在控制台程序中

时间:2010-04-15 06:34:33

标签: objective-c cocoa macos

我没有在我继承的NSOpenGLView上获得 - (void)keyDown回调(请注意,虽然我执行setAcceptsMouseMovedEvents:YES但是mouseMoved不起作用,但这还不是问题)。它实现了

- (BOOL)acceptsFirstResponder
{
    return YES;
}

但仍然没有运气。我的知识渊博的朋友暗示它可能与应用程序仍然是一个控制台应用程序而不是捆绑的.app(我目前正在移植它)有关。如果是这样的话:是否有某种方法可以规避?原因可能是别的吗?当我终止我的控制台应用程序时,我经常看到我的所有按键都转到stdout所以它看起来似乎合理......

修改

@implementation UiMacApplication
- (void)run
{
}
- (void)terminate:(id)sender
{
    ...
}
- (void)startDummyThread:(id)sender
{
    printf("startDummyThread!\n");
}
@end

....

mApplication = (UiMacApplication*)[UiMacApplication sharedApplication];
[NSThread detachNewThreadSelector: @selector(startDummyThread:) toTarget: mApplication withObject: nil];
[[NSNotificationCenter defaultCenter] postNotificationName:NSApplicationWillFinishLaunchingNotification object: NSApp];
[[NSNotificationCenter defaultCenter] postNotificationName:NSApplicationDidFinishLaunchingNotification object: NSApp];

主循环:

NSEvent* event = [mApplication  nextEventMatchingMask:  NSAnyEventMask
                                  untilDate:              nil
                                  inMode:                 NSDefaultRunLoopMode
                                  dequeue:                YES];

[mApplication sendEvent: event];
[mApplication updateWindows];

编辑2: 通过控制台运行导致了问题。只需将其转换为正确的.app,即可在第一次尝试时接收keyDown,keyUp和flagsChanged。

2 个答案:

答案 0 :(得分:1)

您是否有NSApplication个实例,并且是否向其发送了-run消息?能够接收事件是非常重要的。

答案 1 :(得分:1)

你同时做的工作超出了你的需要而且没有做任何接近你需要的工作量。

NSApplication已经实现了它的run方法,事件循环等。我不知道你为什么编写这个子类; NSApplication似乎没有做任何事情。您替换NSApplication的实现不完整且不充分,因此无效。

我的建议是破解这个UiMacApplication类,只使用普通的NSApplication。不要滚动自己的事件循环,也不要直接调用run;请致电NSApplicationMain()。您可能也不需要该线程,但如果,则编写application delegate并从那里开始创建线程。

通常,您几乎不需要子类化Cocoa类 - 当然不是为了使应用程序运行等基本内容。有例外,但它们要么非常罕见,要么标记清楚。