Странное поведение: перетаскивание из стеков в элемент состояния не работает - PullRequest
4 голосов
/ 02 марта 2012

Мое приложение позволяет перетаскивать как в главное окно, так и в элемент состояния.

  • Если я перетаскиваю файл из стеков в свое окно, оно отлично работает.
  • Если яперетащите файл из Finder в мое окно, оно отлично работает.
  • Если я перетаскиваю файл из Finder в свой элемент статуса, он отлично работает.
  • Если я перетаскиваю файл из стека в свой элемент статуса, он не работает.

И окно, и элемент состояния используют один и тот же код обработки перетаскиванием.

Забавно, что при перетаскивании файла из стеков на элемент состояния курсор меняется, как и ожидалось, поскольку - (NSDragOperation) draggingEntered: (id) sender {NSPasteboard * pboard;NSDragOperation sourceDragMask; метод вызывается, как и ожидалось.

Однако, когда файл удаляется, - (BOOL) executeDragOperation: (id) sender {NSPasteboard * pboard;NSDragOperation sourceDragMask; метод НЕ вызывается.

Вот реализация первого метода:

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {
    NSPasteboard *pboard;
    NSDragOperation sourceDragMask;

    sourceDragMask = [sender draggingSourceOperationMask];
    pboard = [sender draggingPasteboard];

    if ( [[pboard types] containsObject:NSColorPboardType] ) {
        if (sourceDragMask & NSDragOperationGeneric) {
            return NSDragOperationGeneric;
        }
    }
    if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
        if (sourceDragMask & NSDragOperationLink) {
            return NSDragOperationLink;
        } else if (sourceDragMask & NSDragOperationCopy) {
            return NSDragOperationCopy;
        }
    }

    return NSDragOperationNone;
}

Спасибо!

Ответы [ 2 ]

5 голосов
/ 31 мая 2012

Это законный вопрос.Я отправил отчет об ошибке в Apple.http://openradar.appspot.com/radar?id=1745403

А пока я нашел обходной путь.Даже если executeDragOperation: никогда не вызывается, draggingEnded: все еще остается.Вы все еще можете определить, был ли файл удален в NSStatusItem, проверив, была ли точка «draggingLocation» внутри прямоугольника NSView.Вот пример:

- (void)draggingEnded:(id<NSDraggingInfo>)sender
{
    if(NSPointInRect([sender draggingLocation],self.frame)){
        //The file was actually dropped on the view so call the performDrag manually
        [self performDragOperation:sender];
    }
}

Надеюсь, это поможет, пока ошибка не будет исправлена.

1 голос
/ 07 августа 2018

Не уверен, почему это происходит. Не понравилось вынужденное решение, за которое проголосовали лидеры. Это должно сделать трюк:

- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender
{
    return [sender draggingSourceOperationMask];
}
...