NSOpenGLView, NSWindow & NSResponder - makeFirstResponder не работает - PullRequest
4 голосов
/ 19 сентября 2011

В приведенном ниже коде я инициализирую NSViewController [NSResponder] с NSWindow, NSOpenGLView, представляю представление и пытаюсь установить 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 ]

3 голосов
/ 24 октября 2011

Возвращаясь к этой проблеме, на самом деле проблема в другом месте.

Я использовал эту функцию сна, чтобы контролировать частоту кадров приложений:

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 голосов
/ 28 марта 2013

У меня тоже была эта проблема.Этот поток может помочь

keyDown не вызываться

Я выяснил, что мешает вызывать событие keyDown.Это была маска NSBorderlessWindowMask, она не позволяет окну стать ключом и главным окном.Итак, я создал подкласс NSWindow с именем BorderlessWindow:

 @interface BorderlessWindow : NSWindow { }

 @end

 @implementation BorderlessWindow

 - (BOOL)canBecomeKeyWindow {
     return YES; }

 - (BOOL)canBecomeMainWindow {
     return YES; }

 @end
2 голосов
/ 20 сентября 2011

Чтобы экземпляры участвовали в циклах просмотра ключей, пользовательское представление должно возвращать ДА из acceptptsFirstResponder .

...