首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用NSStatusItem作为拖拽目的地?

如何使用NSStatusItem作为拖拽目的地?
EN

Stack Overflow用户
提问于 2011-05-15 07:48:52
回答 2查看 2K关注 0票数 10

我正在尝试构建一个应用程序,允许用户将文件从Finder拖动到菜单栏图标进行处理。我在旅途中取得了进展,但我似乎无法登上这座山。我尝试对NSView进行子类化并实现拖动消息。

代码语言:javascript
复制
@interface CMDroppableView : NSView <NSMenuDelegate>

我不仅想接受拖动操作,还想在用户单击图标时提供一个NSMenu。我已经设法让NSMenu正确显示,但拖动功能仍然难以实现。

我的理解是,我需要注册接受的拖动类型,我已经在这里完成了:

代码语言:javascript
复制
-(void)awakeFromNib{
[self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];
}

拖动消息:

代码语言:javascript
复制
-(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;
}

下面是设置自定义视图的代码:

代码语言:javascript
复制
statusItemView = [[CMDroppableView alloc] init];
[statusItemView retain];
[statusItemView setMenu: statusMenu];

[statusItem setView: statusItemView];   

还是一无所获。那么,我哪里错了呢?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-15 12:41:40

编辑:哦,您在-awakeFromNib中注册了拖动类型,如果视图不是从nib加载的,就不会调用它。尝试在-initWithFrame:中注册您的拖动类型!

老生常谈:

IIRC您不需要在状态项上设置菜单。我所做的是让我的自定义视图管理一个菜单,并执行以下操作:

代码语言:javascript
复制
- (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
}

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

票数 6
EN

Stack Overflow用户

发布于 2011-05-16 01:21:20

经过反复试验,我偶然找到了解决方案。我在awakeFromNib消息中注册了我可接受的拖动类型(如原始问题所示)。然而,我没有使用IB来设置这个视图,所以这个方法从未被调用过。将注册码移动到initFromFrame消息似乎解决了这个问题。

代码语言:javascript
复制
- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        ...
        [self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];
    }
    return self;
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6005539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档