这是我的代码:
#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)
答案 0 :(得分:3)
您无法将此代码放入main()
。没有应用程序对象,因此没有与窗口服务器的连接。没有事件循环。坦率地说,正如代码所代表的那样,您的程序将立即退出,因为没有什么可以阻止执行从main()
结束。
您的main()
应致电NSApplicationMain()
。理想情况下,您的应用应与Info.plist文件和MainMenu NIB正确捆绑。加载NIB将实例化设计的控制器类的实例,并将其指定为应用程序对象的委托。然后,您可以在应用代理的-applicationDidFinishLaunching:
方法中添加与您类似的早期启动代码。
如果由于某种原因您拒绝使用NIB,可以在[NSApplication sharedApplication]
中致电main()
。实例化您的控制器类,并使用[NSApp setDelegate:yourObject]
直接将其指定为应用程序对象的委托。然后拨打[NSApp run]
。同样,应该在委托方法中进行进一步的初始化。