拖放 - 仅接受文件夹

时间:2011-06-01 22:09:16

标签: objective-c cocoa drag-and-drop osx-snow-leopard nsdragginginfo

我正在编写一个需要接受文件夹删除的自定义视图。条件是:只接受目录,因此当用户拖动文件时,不会发生任何事情。

我已经注册了我的观点:

[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 个答案:

答案 0 :(得分:6)

如果粘贴板包含文件,您应该在-draggingEntered:中实施测试并返回NSDragOperationNone

但是,由于您还实现了‑draggingUpdated:,因此您还需要将文件夹类型的测试添加到该方法中。

目前,您总是在NSDragOperationCopy中返回‑draggingUpdated:而未对文件类型进行测试,这意味着只要鼠标在拖动目标内移动,光标就会变为复制游标无论你在‑draggingEntered:做什么。

请注意,实施‑draggingUpdated:是可选的。如果您没有实现具有多个可能的拖动目标的复杂视图,那么您不需要实现它,只需‑draggingEntered:‑draggingExited: