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

前端之家收集整理的这篇文章主要介绍了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&C++相关文章