Cocoa keyDown事件不会调用

时间:2015-05-22 13:55:42

标签: objective-c cocoa

这是我的代码:

#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子标记吗?还是NSCOntroller?如何将此子类连接到我的OGLView?请帮忙..我是Objective-C的新手。我也在Eclipse上编程(不是Xcode)

1 个答案:

答案 0 :(得分:3)

您无法将此代码放入main()。没有应用程序对象,因此没有与窗口服务器的连接。没有事件循环。坦率地说,正如代码所代表的那样,您的程序将立即退出,因为没有什么可以阻止执行从main()结束。

您的main()应致电NSApplicationMain()。理想情况下,您的应用应与Info.plist文件和MainMenu NIB正确捆绑。加载NIB将实例化设计的控制器类的实例,并将其指定为应用程序对象的委托。然后,您可以在应用代理的-applicationDidFinishLaunching:方法中添加与您类似的早期启动代码。

如果由于某种原因您拒绝使用NIB,可以在[NSApplication sharedApplication]中致电main()。实例化您的控制器类,并使用[NSApp setDelegate:yourObject]直接将其指定为应用程序对象的委托。然后拨打[NSApp run]。同样,应该在委托方法中进行进一步的初始化。