Cocoa Drag and Drop,读回数据

时间:2010-06-07 06:48:03

标签: cocoa drag-and-drop

好的,我有一个NSOutlineView设置,如果将pdf拖入NSOutlineView,我希望它能捕获PDF。

我的第一个问题,我有以下代码:

[outlineView registerForDraggedTypes:[NSArray arrayWithObjects:NSStringPboardType, NSFilenamesPboardType, nil]];

在我看过的所有Apple Docs和例子中,我也看到像MySupportedType这样的东西是一个注册拖动的对象。这是什么意思?我是否将代码更改为:

[outlineView registerForDraggedTypes:[NSArray arrayWithObjects:@"pdf", NSStringPboardType, NSFilenamesPboardType, nil]];

目前我已将其设置为识别拖放,并且一旦拖动被接受,我甚至可以使其吐出拖动文件的URL,但是,这引出了我的第二个问题。我想保留这些PDF应用程序端的副本。我想,如果我错了,请纠正我,最好的方法是从剪贴板中取出数据,将其保存在一些持久存储中,就是这样。 (因为使用某种复制命令并将文件复制到应用程序控制器。)

话虽如此,我不知道该怎么做。我有代码:

- (BOOL)outlineView:(NSOutlineView *)ov acceptDrop:(id <NSDraggingInfo>)info item:(id)item childIndex:(NSInteger)childIndex 
{
    NSPasteboard *pboard = [info draggingPasteboard];
    NSURL *fileURL;
    if ( [[pboard types] containsObject:NSURLPboardType] ) {
        fileURL = [NSURL URLFromPasteboard:pboard];
        // Perform operation using the file’s URL
    }

    NSData *data = [pboard dataForType:@"NSPasteboardTypePDF"];

但这实际上从未获得任何数据。就像我之前说的那样,它确实得到了URL,而不是数据。  有没有人对如何实现这一目标有任何建议?非常感谢!

1 个答案:

答案 0 :(得分:4)

拖动类型

拖动类型只是定义系统粘贴板类型(如NSFilenamesPboardType)或应用程序自己的内部类型的字符串(如“MyWidgetIdentifierType”,用于通过某个内部ID标识窗口小部件)。

“PDF”的拖动类型不能为您提供任何帮助。你可以把它称为“Bob8374Type”...如果你不给你的应用程序识别类型的能力(或者没有任何东西将任何东西放入该类型的粘贴板中),它完全没用。您正在使用拖动的文件,因此NSFilenamesPboardType是正确的。

除非粘贴板上有NSPasteboardTypePDF数据,否则NSPasteboardTypePDF将无法帮助您。拖动文件时,您将获得NSFilenamesPboardType。如果文件是.pdf或.xyz,则无关紧要;你只是在路上。

复制文件或存储路径

您需要决定是要复制已删除的PDF还是仅存储路径(或更好的文件系统引用)。如果您要复制PDF,则需要确保知道正确的存储位置(如Application Support文件夹等)。

假设您确实想要在某处复制已删除的pdf,则不需要PDF数据。您可以使用NSFileManager将给定路径上的文件复制(或移动)到新位置。如果您有其他存储机制(即,您想将文件的PDF数据吸收到其他数据结构中),您可以直接使用NSData的+dataWithContentsOfURL:options:error:获取PDF数据并根据需要处理其数据