NSFilenamesPboardType在10.14就被否决了,建议使用NSPasteboardTypeFileURL。这给了我文件名
file:///.file/id=6571367.12885025918
而NSWorkspace也无法让UTI脱离困境。
如何从NSPasteboardTypeFileURL获取UTI?
旧代码:
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
{
NSDragOperation sourceDragMask = [sender draggingSourceOperationMask];
NSDragOperation resultingDragMask = NSDragOperationNone;
NSPasteboard *pboard = [sender draggingPasteboard];
if ([[pboard types] containsObject:NSFilenamesPboardType]) {
NSArray <NSString *>*list = [pboard propertyListForType:NSFilenamesPboardType];
NSString *firstItem = [list objectAtIndexedSubscript:0];
NSError *error;
NSString *UTI = [[NSWorkspace sharedWorkspace] typeOfFile:firstItem error:&error];
if (!error) {
if ([[NSImage imageTypes] containsObject:UTI]) {
resultingDragMask = NSDragOperationCopy;
}
}
} else if ([[pboard types] containsObject:NSPasteboardTypeTIFF]) {
resultingDragMask = NSDragOperationCopy;
}
if (sourceDragMask & NSDragOperationCopy && resultingDragMask & NSDragOperationCopy) {
return NSDragOperationCopy;
}
return NSDragOperationNone;
}使用NSPasteboardTypeFileURL,我得到了不存在状态文件的错误。从纸板上拖来的:
打印错误描述: Error Domain=NSCocoaErrorDomain Code=260“文件”“id=6571367.12885025918”无法打开,因为没有这样的文件。UserInfo={NSURL=file:/.file/id=6571367.12885025918 - file:///Users/xxx/Library/Containers/com.xxx.imageviewfix/Data/,NSFilePath=/Users/xxx/Library/Containers/com.xxx.imageviewfix/Data/file:/.file/id=6571367.12885025918,NSUnderlyingError=0x600000c70d80 {Error Domain=NSPOSIXErrorDomain Code=2“无此类文件或目录”}}
发布于 2019-11-22 06:30:55
我很晚才回答这个问题,但我发现这是可行的:
NSArray<Class> *classes = @[[NSURL class]];
NSDictionary *options = @{};
NSArray<NSURL*> *files = [pboard readObjectsForClasses:classes options:options];
for (NSURL *url in files)
{
NSString *str = [url path];
// TODO: do something with str.
}与另一个答案不同,删除多个文件适用于这种方法。
发布于 2019-05-18 13:00:30
获取NSURL对象的路径将获得原始文件名。唯一缺少的是NSFilenamesPboardType用来提供的文件路径数组。
NSString *fileURL = [[NSURL URLFromPasteboard:pboard] path];更新代码:
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
{
NSDragOperation sourceDragMask = [sender draggingSourceOperationMask];
NSDragOperation resultingDragMask = NSDragOperationNone;
NSPasteboard *pboard = [sender draggingPasteboard];
if ([[pboard types] containsObject:NSPasteboardTypeFileURL]) {
NSString *fileURL = [[NSURL URLFromPasteboard:pboard] path];
NSError *error;
NSString *UTI = [[NSWorkspace sharedWorkspace] typeOfFile:fileURL error:&error];
if (!error) {
if ([[NSImage imageTypes] containsObject:UTI]) {
resultingDragMask = NSDragOperationCopy;
}
}
} else if ([[pboard types] containsObject:NSPasteboardTypeTIFF]) {
resultingDragMask = NSDragOperationCopy;
}
if (sourceDragMask & NSDragOperationCopy && resultingDragMask & NSDragOperationCopy) {
return NSDragOperationCopy;
}
return NSDragOperationNone;
}https://stackoverflow.com/questions/56199062
复制相似问题