objective-c - 如何使用 NSStatusItem 作为拖动目标?

标签 objective-c macos cocoa drag-and-drop nsdragginginfo

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

这是设置自定义 View 的代码:

statusItemView = [[CMDroppableView alloc] init];
[statusItemView retain];
[statusItemView setMenu: statusMenu];

[statusItem setView: statusItemView];   

仍然没有。那么我哪里出错了?

谢谢!

最佳答案

通过反复试验,我偶然发现了解决方案。我在 awakeFromNib 消息中注册了我可接受的拖动类型(如原始问题中所示)。但是,我没有使用 IB 来设置此 View ,因此从未调用过此方法。将注册码移至 initFromFrame 消息似乎可以解决问题。

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        ...
        [self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];
    }
    return self;
}

关于objective-c - 如何使用 NSStatusItem 作为拖动目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6005539/

相关文章:

xcode - 导出 OS X 应用程序时指定配置文件

swift - 如何使用 swift 为 OS X 应用程序的标题栏着色

cocoa - 在 NSTextView 中设置默认字体

java - 使用 C++ 中的库为 PhoneGap 创建插件

ios - 在 NSObject iOS 中取消 objective-c block

ios - 在 facebook 上将 viewcontroller 的屏幕截图作为 url 发布

xcode - XCode中没有“转到最后一个编辑位置”快捷方式吗?

ios - 在 iOS 上从网页下载 CSV 文件

ios - 我的 For 循环中的计数没有递增

objective-c - cocoa 旋转元素在窗口调整大小后消失