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

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

Я зарегистрировал свою точку зрения с:

[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:,

Другие вопросы по тегам