【发布时间】:2011-08-25 17:17:37
【问题描述】:
我正在尝试构建一个允许用户将文件从 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];
还是什么都没有。那我哪里做错了?
谢谢!
【问题讨论】:
-
你实现了 draggingEntered: 和 performDragOperation: 方法吗?
-
是的,我有。我会更新我的问题以包括它们。
-
我怀疑你只是无法做到这一点。将对象拖动到菜单不是正常的 UI 行为,我认为
NSStatusItem视图可以具有的交互可能存在系统级限制。如果视图响应的不是 mouseUp/Down,我会感到惊讶。 -
@Rob,这很有趣。那么,CloudApp 之类的应用程序如何让您将文件拖放到状态栏图标上?
-
@Wevah,你能回答这个问题吗?
标签: objective-c macos cocoa drag-and-drop nsdragginginfo