Перетащите с NSStatusItem - PullRequest
       6

Перетащите с NSStatusItem

15 голосов
/ 14 апреля 2011

Я пытаюсь написать приложение, которое позволяет пользователю перетаскивать файлы из Finder и помещать их в NSStatusItem. До сих пор я создал собственное представление, которое реализует интерфейс перетаскивания. Когда я добавляю это представление как подпредставление NSWindow, все работает правильно - курсор мыши выдает соответствующую обратную связь, и когда отбрасывается, мой код выполняется.

Однако, когда я использую тот же вид, что и вид NSStatusItem's, он работает неправильно. Курсор мыши выдает соответствующую обратную связь, указывающую, что файл можно удалить, но когда я удаляю файл, мой код удаления никогда не выполняется.

Что-то особенное, что мне нужно сделать, чтобы включить перетаскивание с NSStatusItem?

Ответы [ 2 ]

30 голосов
/ 27 июня 2011

Наконец-то я приступил к тестированию, и оно отлично работает, поэтому с вашим кодом определенно что-то не так.

Вот пользовательский вид, который позволяет перетаскивать:

@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];
11 голосов
/ 08 ноября 2014

Начиная с Yosemite, метод установки представления на NSStatusItem устарел, но, к счастью, есть более приятный способ использования свойства NSStatusItemButton на NSStatusItem:

- (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 или ниже.

...