objective-c – 如何使用NSStatusItem作为拖放目的地?

我正在尝试构建一个应用程序,允许用户文件从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
}

在我的自定义视图的实现.这确保菜单行为与认值相同.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...