objective-c – 如何使用NSStatusItem作为拖放目的地?
发布时间:2020-12-16 05:59:28 所属栏目:百科 来源:网络整理
导读:我正在尝试构建一个应用程序,允许用户将文件从Finder拖到菜单栏图标进行处理.我在旅程中取得了进步,但我似乎不敢高峰.我尝试子类化NSView并实现拖动消息. @interface CMDroppableView : NSView NSMenuDelegate 我不仅要接受拖动操作,而且要在用户点击图标时
我正在尝试构建一个应用程序,允许用户将文件从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 } 在我的自定义视图的实现.这确保菜单行为与默认值相同. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |