问题描述
我试图写一个应用程序,允许用户从Finder中拖动文件,并将它们放置到 NSStatusItem
。到目前为止,我创建了一个实现拖放界面的自定义视图。当我将这个视图添加为 NSWindow
的子视图时,所有这些都正常工作 - 鼠标光标提供适当的反馈,当我删除时,我的代码被执行。
I'm trying to write an application that allows the user to drag files from the Finder and drop them onto an NSStatusItem
. So far, I've created a custom view that implements the drag and drop interface. When I add this view as a subview of an NSWindow
it all works correctly -- the mouse cursor gives appropriate feedback, and when dropped my code gets executed.
然而,当我使用与 NSStatusItem的
视图相同的视图时,它的行为不正确。鼠标光标给出了适当的反馈,指示文件可以被删除,但是当我删除文件时,我的下拉代码永远不会被执行。
However, when I use the same view as an NSStatusItem's
view it doesn't behave correctly. The mouse cursor gives appropriate feedback indicating that the file can be dropped, but when I drop the file my drop code never gets executed.
有什么特别的,我需要做可以使用 NSStatusItem
?
Is there something special I need to do to enable drag and drop with an NSStatusItem
?
推荐答案
这是一个允许拖动的自定义视图:
Here's a custom view that allows dragging:
@implementation DragStatusView
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
//register for drags
[self registerForDraggedTypes:[NSArray arrayWithObjects: NSFilenamesPboardType, nil]];
}
return self;
}
- (void)drawRect:(NSRect)dirtyRect
{
//the status item will just be a yellow rectangle
[[NSColor yellowColor] set];
NSRectFill([self bounds]);
}
//we want to copy the files
- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender
{
return NSDragOperationCopy;
}
//perform the drag and log the files that are dropped
- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
{
NSPasteboard *pboard;
NSDragOperation sourceDragMask;
sourceDragMask = [sender draggingSourceOperationMask];
pboard = [sender draggingPasteboard];
if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];
NSLog(@"Files: %@",files);
}
return YES;
}
@end
您将创建状态项:
NSStatusItem* item = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain];
DragStatusView* dragView = [[DragStatusView alloc] initWithFrame:NSMakeRect(0, 0, 24, 24)];
[item setView:dragView];
[dragView release];
这篇关于使用NSStatusItem拖放的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!