微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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
}

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

原文地址:https://www.jb51.cc/c/113080.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐