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