在下面的代码中,我正在使用NSViewController
,NSWindow
初始化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;
}
答案 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事件的原因。 它是NSBorderlessWindowMask掩码,它阻止了窗口 成为关键和主要窗口。所以我创建了一个子类 NSWindow称为BorderlessWindow:
@interface BorderlessWindow : NSWindow { }
@end
@implementation BorderlessWindow
- (BOOL)canBecomeKeyWindow {
return YES; }
- (BOOL)canBecomeMainWindow {
return YES; }
@end