2015-05-22 44 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,您可以在您的main()中致电[NSApplication sharedApplication]。实例化您的控制器类并使用[NSApp setDelegate:yourObject]直接将其指定为应用程序对象的代理。然后致电[NSApp run]。再一次,应该在代理的方法中进行进一步的初始化。