Перетаскивание-принимаются только папки
Я пишу пользовательский вид, который должен принимать падения папок. Условие: принимаются только каталоги, поэтому, когда пользователь перетаскивает файл ничего не должно случиться.
Я зарегистрировал свой взгляд с:
[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:
.