Получить UTI NSPasteboardTypeFileURL - PullRequest
1 голос
/ 18 мая 2019

NSFilenamesPboardType устарела 10.14, и предлагается использовать NSPasteboardTypeFileURL. Это дает мне имя файла как

Файл: ///.file/id=6571367.12885025918

и NSWorkspace не могут вытащить UTI из него.

Как получить ИМП от NSPasteboardTypeFileURL?

Старый код:

- (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 я получаю ошибку, которая утверждает, что файл не существует. Притащили из картона:

Распечатка описания ошибки: Ошибка домена = NSCocoaErrorDomain Code = 260 "Файл" id = 6571367.12885025918 "не может быть открыт, потому что нет такого file. "UserInfo = {NSURL = file: /. file / id = 6571367.12885025918 - файл: ///Users/xxx/Library/Containers/com.xxx.imageviewfix/Data/, NSFilePath = / Users / ххх / Library / Контейнеры / com.xxx.imageviewfix / Data / Файл:. / Файл / ID = 6571367,12885025918, NSUnderlyingError = 0x600000c70d80 {Ошибка домена = NSPOSIXErrorDomain Code = 2 "Нет такого файла или каталога"}}

1 Ответ

0 голосов
/ 18 мая 2019

Получение пути к объекту 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;
}
...