如何在 Mac OS X 10.5 中处理从 Finder 中的多个文件拖放?
Posted
技术标签:
【中文标题】如何在 Mac OS X 10.5 中处理从 Finder 中的多个文件拖放?【英文标题】:How do I handle multiple file drag/drop from Finder in Mac OS X 10.5? 【发布时间】:2011-01-01 04:10:14 【问题描述】:我需要从 Finder 中获取所有拖放到我的应用程序中的文件的 URL。
我有一个在 10.6 上运行的 Cocoa 应用程序,它使用新的 10.6 NSPasteboard API 来处理粘贴板上的多个项目。我正在尝试将此应用程序反向移植到 10.5。我如何在 10.5 上处理这个问题?
如果我执行以下操作,我只会得到第一个 URL:
NSArray *pasteTypes = [NSArray arrayWithObjects: NSURLPboardType, nil];
NSString *bestType = [pboard availableTypeFromArray:pasteTypes];
if (bestType != nil)
NSURL *url = [NSURL URLFromPasteboard:pboard];
【问题讨论】:
【参考方案1】:获取多个文件名很容易:(虽然使用 10.5 获取 multiple URLs is not)
-
注册您的视图
NSFilenamesPboardType
在performDragOperation:
中执行以下操作以获取文件路径数组:
NSPasteboard* pboard = [sender draggingPasteboard];
NSArray* filenames = [pboard propertyListForType:NSFilenamesPboardType];
【讨论】:
返回的 NSArray 不是 NSURL*。它是 NSString*。 感谢您指出这一点。 (我将数组从 'urls' 重命名为 'filenames' 以明确其内容不是 NSURL* 类型)【参考方案2】:IKImageKit programming topics
概述了这样做的方法(意译):
NSData *data = [pasteboard dataForType:NSFilenamesPboardType];
NSArray *filenames = [NSPropertyListSerialization
propertyListFromData:data
mutabilityOption:kCFPropertyListImmutable
format:nil
errorDescription:&errorDescription];
请看这里:Image Kit Programming Guide: Supporting Drag and Drop
【讨论】:
【参考方案3】:NSURLPboardType 只处理一个 URL。
要获取文件列表,您需要从 NSFilenamesPboardType 创建一个 NSArray。
Apple 的 docs on drag and drop 相当不错,即使它是旧的东西。
【讨论】:
【参考方案4】:如何在 10.5 上处理[粘贴板上的多个项目]?
试试Pasteboard Manager。
棘手的部分是你正在处理一个drop,这意味着你正在接收一个已经为你创建的NSPasteboard,并且没有办法在NSPasteboard对象和PasteboardRef
s之间进行转换。您必须向 NSPasteboard 询问其 name
,然后将相同的名称传递给 PasteboardCreate
,这可能行不通。
【讨论】:
【参考方案5】:我的 Swift 5.1 两分钱(放入 NSView... 进行自定义)
参见:
Swift: Opening a file by drag-and-drop in window
【讨论】:
以上是关于如何在 Mac OS X 10.5 中处理从 Finder 中的多个文件拖放?的主要内容,如果未能解决你的问题,请参考以下文章