我正在尝试构建一个应用程序,允许用户将文件从Finder拖到菜单栏图标进行处理.我在旅程中取得了进步,但我似乎不敢高峰.我尝试子类化NSView并实现拖动消息.
@interface CMDroppableView : NSView <NSMenuDelegate>
我不仅要接受拖动操作,而且要在用户点击图标时提供一个NSMenu.我设法使NSMenu正确显示,但拖拽功能仍然难以捉摸.
这是我的理解,我需要注册我已经在这里完成的接受的拖动类型:
-(void)awakeFromNib{ [self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; }
拖动邮件:
-(NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender{ NSLog(@"Drag Enter"); return NSDragOperationCopy; } -(NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender{ return NSDragOperationCopy; } -(void)draggingExited:(id <NSDraggingInfo>)sender{ NSLog(@"Drag Exit"); } -(BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender{ return YES; } -(BOOL)performDragOperation:(id <NSDraggingInfo>)sender{ return YES; }
statusItemView = [[CMDroppableView alloc] init]; [statusItemView retain]; [statusItemView setMenu: statusMenu]; [statusItem setView: statusItemView];
依然没有.那么我哪里错了?
谢谢!
解决方法
编辑:呃,你正在-awakeFromNib中注册拖动类型,如果没有从一个笔尖加载视图,那么这个拖动类型就不会被调用.尝试在-initWithFrame中注册您的拖动类型:而不是!
老回答:
IIRC您不需要在状态项目上设置菜单.我做的是让我的自定义视图管理一个菜单,并执行以下操作:
- (void)setMenu:(NSMenu *)menu { [menu setDelegate:self]; [super setMenu:menu]; } - (void)mouseDown:(NSEvent *)event { [statusItem popUpStatusItemMenu:[self menu]]; // or another method that returns a menu } - (void)menuWillOpen:(NSMenu *)menu { highlight = YES; [self setNeedsDisplay:YES]; } - (void)menuDidClose:(NSMenu *)menu { highlight = NO; [self setNeedsDisplay:YES]; } - (void)drawRect:(NSRect)rect { NSImage *img = highlight ? [alternateImage copy] : [image copy]; NSRect bounds = [self bounds]; [statusItem drawStatusBarBackgroundInRect:bounds withHighlight:highlight]; // rest of drawing code goes here,including drawing img where appropriate }