Перетаскивание - принимаются только папки - PullRequest
6 голосов
/ 02 июня 2011

Я пишу пользовательский вид, который должен принимать отбрасывания папок. Условие таково: принимаются только каталоги, поэтому, когда пользователь перетаскивает файл, ничего не должно происходить.

Я зарегистрировал свой взгляд на:

[self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];

И основные методы протокола перетаскивания уже реализованы. Для целей тестирования:

- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender
{
    NSLog("@Drag Entered");
    return NSDragOperationCopy;
}

- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender
{
    return NSDragOperationCopy;
}

- (void)draggingExited:(id<NSDraggingInfo>)sender
{
    NSLog(@"Dragging Exited");
}

- (BOOL)prepareForDragOperation:(id<NSDraggingInfo>)sender { return YES; }
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender    { return YES; }

Так что он работает почти правильно: курсор перетаскивает знак плюс при перетаскивании по виду. Однако я хотел бы избежать этого, если элемент представляет собой обычный файл.

Мне, вероятно, нужно сделать это с NSFileManager (хотя мне интересно, есть ли более простой способ), как только я получу перетаскиваемый путь, но вопрос в том, где. Я попытался включить тест прямо в метод draggingEntered:, возвращающий NSDragOperationNone , но безуспешно. Я следую отрывку из документации Apple:

{
    NSPasteboard *pboard = [sender draggingPasteboard];

    if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
        NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];
        int numberOfFiles = [files count];
        // Perform operation using the list of files
    }
    return YES;
}

Где я должен реализовать этот тест, чтобы курсор оставался прежним, если вместо этого файл перетаскивается?

1 Ответ

6 голосов
/ 02 июня 2011

Вы должны реализовать тест в -draggingEntered: и вернуть NSDragOperationNone, если на монтажном столе есть файл.

Однако, поскольку вы также внедрили ‑draggingUpdated:, вам необходимо добавить тест для типов папок и в этот метод.

В настоящее время вы всегда возвращаете NSDragOperationCopy в ‑draggingUpdated: без проверки типа файла, а это означает, что как только мышь перемещается внутри места назначения перетаскивания, курсор изменится на курсор копирования независимо от того, что делать в ‑draggingEntered:.

Обратите внимание, что реализация ‑draggingUpdated: является необязательной. Если вы не реализуете сложное представление с несколькими возможными назначениями перетаскивания, вам не нужно его реализовывать, просто ‑draggingEntered: и ‑draggingExited:.

...