用NSStatusItem拖放

| 我正在尝试编写一个应用程序,允许用户从Finder拖动文件并将其拖放到“ 0”上。到目前为止,我已经创建了一个实现拖放界面的自定义视图。当我将此视图添加为ѭ1的子视图时,所有视图均能正常工作-鼠标光标会给出适当的反馈,并且在放下代码时将执行我的代码。 但是,当我使用与“ 2”视图相同的视图时,它的行为不正确。鼠标光标会给出适当的反馈,指示可以删除该文件,但是当我删除该文件时,我的删除代码将永远不会执行。 我需要做些特殊的事情来启用带有“ 0”的拖放功能吗?     
已邀请:
我终于开始进行测试,它可以完美运行,因此您的代码肯定存在问题。 这是一个允许拖动的自定义视图:
@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
上设置视图的方法,但幸运的是,在
NSStatusItem
上使用新的
NSStatusItemButton
属性有一种更好的方法:
- (void)applicationDidFinishLaunching: (NSNotification *)notification {
    NSImage *icon = [NSImage imageNamed:@\"iconName\"];
    //This is the only way to be compatible to all ~30 menu styles (e.g. dark mode) available in Yosemite
    [normalImage setTemplate:YES];
    statusItem.button.image = normalImage;

    // register with an array of types you\'d like to accept
    [statusItem.button.window registerForDraggedTypes:@[NSFilenamesPboardType]];
    statusItem.button.window.delegate = self;
}
- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender {
    return NSDragOperationCopy;
}

- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
  //drag handling logic
}
请注意,
button
属性仅从10.10开始可用,如果支持10.9 Mavericks或更低版本,则可能必须保留旧的解决方案。     

要回复问题请先登录注册