Перетаскивание-принимаются только папки

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

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

[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 ответов


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

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

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

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