NSOpenGLView,NSWindow& NSResponder - makeFirstResponder不工作

时间:2011-09-19 18:13:36

标签: cocoa nswindow keydown nsevent first-responder

在下面的代码中,我正在使用NSViewControllerNSWindow初始化NSOpenGLView [NSResponder],展示视图并尝试将NSViewController设置为Windows第一响应者。

它不起作用。我希望能够在下面的keyUp:keyDown:方法中找到一个断点,但一切都没有发生。

我错过了什么吗?

-(void)initwithFrame:(CGRect)frame 
{
    window = [[MyNSWindow alloc] initWithContentRect:frame styleMask:NSClosableWindowMask | NSTitledWindowMask backing:NSBackingStoreBuffered                           defer: YES ];   


    OpenGLView* glView = [[[OpenGLView alloc] initWithFrame:window.frame] autorelease];

    window.contentView = glView;

    [window makeFirstResponder:self];   
    [window makeKeyWindow];     

    [window display];   
}   

-(void)keyDown:(NSEvent*)theEvent
{
    unichar unicodeKey = [ [ theEvent characters ] characterAtIndex:0 ];
    unicodeKey = 0;
}

-(void)keyUp:(NSEvent *)theEvent
{
    unichar unicodeKey = [ [ theEvent characters ] characterAtIndex:0 ];
    unicodeKey = 0;
}

3 个答案:

答案 0 :(得分:3)

回到这个问题,实际上问题出在其他地方。

我一直在使用此睡眠功能来控制应用帧速率:

void System::Sleep(double seconds)
{
    NSDate* limit       = [NSDate dateWithTimeIntervalSinceNow:seconds];
    NSRunLoop* runLoop  = [NSRunLoop currentRunLoop];

    [runLoop runUntilDate:limit];
}

这样做似乎会完全冻结系统并阻止关键事件。

而是使用它来安排更新功能:

[NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(updateApp:) userInfo:nil repeats:YES];

答案 1 :(得分:2)

对于参与键视图循环的实例,自定义视图必须从 acceptsFirstResponder 返回 YES

答案 2 :(得分:2)

我也有这个问题。这个帖子可能有帮助

keyDown not being called

  

我发现了阻止调用keyDown事件的原因。   它是NSBorderlessWindowMask掩码,它阻止了窗口   成为关键和主要窗口。所以我创建了一个子类   NSWindow称为BorderlessWindow:

 @interface BorderlessWindow : NSWindow { }

 @end

 @implementation BorderlessWindow

 - (BOOL)canBecomeKeyWindow {
     return YES; }

 - (BOOL)canBecomeMainWindow {
     return YES; }

 @end