2015-05-22 3 views
1

Вот мой код:какао KeyDown событие не вызывает

#import <Cocoa/cocoa.h> 
#import <AppKit/AppKit.h> 

@interface OGLView: NSOpenGLView{} 
@end 

@implementation OGLView 

- (void)keyDown:(NSEvent *)event { 
NSLog(@"Hi there");//never called 
} 

- (BOOL)acceptsFirstResponder{return YES;} 

- (BOOL)becomeFirstResponder{return YES;} 

- (BOOL)resignFirstResponder{return YES;} 

- (BOOL)canBecomeKeyView { return YES; } 
@end 

int main(int argc, char* args[]){ 
NSWindow *win = nil; 
NSRect e = [[NSScreen mainScreen] frame]; 

win = [ [NSWindow alloc] 
     initWithContentRect: e 
       styleMask: NSTitledWindowMask 
          |NSClosableWindowMask 
          |NSMiniaturizableWindowMask 
        backing: NSBackingStoreBuffered 
       defer: NO ]; 


view =[[[OGLView alloc] initWithFrame:e] 
         autorelease]; 


    [win orderFrontRegardless]; 
    [win setReleasedWhenClosed:YES]; 
    [win setContentView:view]; 

    [win setInitialFirstResponder:view]; 
    [win setNextResponder:view]; 
    [win makeFirstResponder:view]; 


    [win setAcceptsMouseMovedEvents:YES]; 



[view setNeedsDisplay:YES]; 
[view display]; 
} 

ли я должен создать NSResponder subcalss? Или NSCOntroller? Как подключить эти подклассы к моему OGLView? Пожалуйста, помогите .. Я новичок в Objective-C. Также я программирую на Eclipse (не Xcode)

ответ

3

Вы не можете поместить этот код в main(). Нет объекта приложения, поэтому соединение с сервером окон отсутствует. Нет цикла событий. Честно говоря, по мере того, как код стоит, ваша программа выйдет немедленно, потому что ничего не мешает исполнению отпасть от конца main().

Ваш main() должен позвонить по номеру NSApplicationMain(). В идеале ваше приложение должно быть правильно в комплекте с файлом Info.plist и MainMenu NIB. Загрузка этого NIB будет представлять экземпляр класса контроллера вашего дизайна и назначить его как делегата объекта приложения. Затем вы бы поставили ранний код запуска, как ваш, в методе делегата -applicationDidFinishLaunching:.

Если по какой-либо причине вы отказываетесь от использования NIB, вы можете позвонить [NSApplication sharedApplication] в свой main(). Выполните активацию своего класса контроллера и напрямую назначьте его как делегата объекта приложения, используя [NSApp setDelegate:yourObject]. Затем позвоните по телефону [NSApp run]. Опять же, дальнейшая инициализация должна быть выполнена в методах делегата.

Смежные вопросы