2011-09-19 21 views
4

在下面的代码我正在初始化一个NSViewController [一个NSResponder类],具有NSWindow,一个NSOpenGLView,呈现所述视图和尝试将NSViewController作为窗户第一响应。NSOpenGLView,NSWindow&NSResponder类 - makeFirstResponder不工作

它不工作。我期待能够在下面的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; 
} 

回答

2

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

+0

由于做这个职位,我曾尝试加入以下视图类: - (BOOL)acceptsFirstResponder { 返回YES; } 未影响行为。 –

+0

@ BROK3NS0UL尝试类似 - (void)keyDown:(NSEvent *)theEvent {NSString * characters = [theEvent characters]; NSLog(@“Key:”,characters); } –

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]; 
2

我也有这个问题。这个线程可以帮助

keyDown not being called

我发现了什么是防止被称为keyDown事件。 它是NSBorderlessWindowMask掩码,它可以防止来自 的窗口成为关键窗口和主窗口。所以我创建 NSWindow的子类,称为BorderlessWindow:

@interface BorderlessWindow : NSWindow { } 

@end 

@implementation BorderlessWindow 

- (BOOL)canBecomeKeyWindow { 
    return YES; } 

- (BOOL)canBecomeMainWindow { 
    return YES; } 

@end