首页 文章

使用NSStatusItem拖放

提问于
浏览
15

我正在尝试编写一个应用程序,允许用户从Finder中拖动文件并将其拖放到 NSStatusItem 上 . 到目前为止,我已经创建了一个实现拖放界面的自定义视图 . 当我将此视图添加为 NSWindow 的子视图时,一切正常 - 鼠标光标提供适当的反馈,当删除时,我的代码被执行 .

但是,当我使用与 NSStatusItem's 视图相同的视图时,它的行为不正确 . 鼠标光标提供适当的反馈,表明文件可以被删除,但是当我删除文件时,我的丢弃代码永远不会被执行 .

我需要做些什么特别的事情才能使用 NSStatusItem 来拖放?

2 回答

  • 11

    我终于开始测试这个了,它运行得很好,所以你的代码肯定有问题 .

    这是一个允许拖动的自定义视图:

    @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];
    
  • 30

    自Yosemite以来,在 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或更低的小牛,您可能必须保留旧的解决方案 .

相关问题