NSOpenGLView, NSWindow и NSResponder — makeFirstResponder не работает

В приведенном ниже коде я инициализирую 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;
}

person Seamus    schedule 19.09.2011    source источник


Ответы (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];
person Seamus    schedule 24.10.2011

Чтобы экземпляры могли участвовать в циклах ключ-представление, пользовательское представление должно возвращать YES от acceptsFirstResponder.

person Rudi Rüssel    schedule 20.09.2011
comment
После создания этого поста я попытался добавить в класс представления следующее: -(BOOL)acceptsFirstResponder { return YES; } Не повлияло на поведение. - person Seamus; 20.09.2011
comment
@BROK3NS0UL Попробуйте что-нибудь вроде - (void)keyDown:(NSEvent*)theEvent { NSString *characters = [символы theEvent]; NSLog(@Key: , символы); } - person Rudi Rüssel; 21.09.2011

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

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

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

 @interface BorderlessWindow : NSWindow { }

 @end

 @implementation BorderlessWindow

 - (BOOL)canBecomeKeyWindow {
     return YES; }

 - (BOOL)canBecomeMainWindow {
     return YES; }

 @end
person Joseph Astrahan    schedule 28.03.2013