我有一个名为SurfaceView的自定义NSView.它是NSWindow的contentView,它处理鼠标点击和绘图等基本事件.但是不管我做什么都没关系,它不处理keyDown函数.我已经覆盖了acceptFirstResponder但没有任何反应.
如果重要,我使用自定义NSEvent循环运行应用程序,如下所示:
NSDictionary* info = [[NSBundle mainBundle] infoDictionary]; Nsstring* mainNibName = [info objectForKey:@"NSMainNibFile"]; NSApplication* app = [NSApplication sharedApplication]; NSNib* mainNib = [[NSNib alloc] initWithNibNamed:mainNibName bundle:[NSBundle mainBundle]]; [mainNib instantiateNibWithOwner:app topLevelObjects:nil]; [app finishLaunching]; while(true) { NSEvent* event = [app nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate date] inMode:NSDefaultRunLoopMode dequeue:YES]; [app sendEvent:event]; // Some code is execute here every frame to do some tasks... usleep(5000); }
这是SurfaceView代码:
@interface SurfaceView : NSView { Panel* panel; } @property (nonatomic) Panel* panel; - (void)drawRect:(NSRect)dirtyRect; - (BOOL)isFlipped; - (void)mouseDown:(NSEvent *)theEvent; - (void)mouseDragged:(NSEvent *)theEvent; - (void)mouseUp:(NSEvent *)theEvent; - (void)keyDown:(NSEvent *)theEvent; - (BOOL)acceptsFirstResponder; - (BOOL)becomeFirstResponder; @end
–
@implementation SurfaceView @synthesize panel; - (BOOL)acceptsFirstResponder { return YES; }; - (void)keyDown:(NSEvent *)theEvent { // this function is never called }; ... @end
这是我创建视图的方式:
NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(left,top,wide,tall) styleMask:NSBorderlessWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask backing:NSbackingStoreBuffered defer:NO]; ... [window makeKeyAndOrderFront:nil]; SurfaceView* mainView = [SurfaceView alloc]; [mainView initWithFrame:NSMakeRect(0,tall)]; mainView.panel = panel; [window setContentView:mainView]; [window setinitialFirstResponder:mainView]; [window setNextResponder:mainView]; [window makeFirstResponder:mainView];