Несколько типов на монтажном столе, включая файлы, rtfd и пользовательский тип (Mac OS X 10.6)

Кажется, что новый интерфейс API для монтажа в 10.6 хорошо работает, как только вы разберетесь с UTI, но я столкнулся с ситуацией, которую я не могу взломать: что, если вы объявляете несколько типов данных вместе с перетаскиванием файла?

Посмотрите, как работает новый монтажный щит, вы помещаете на него данные, используя setString, setData, setPropertyList или writeObjects. Первые 3 требуют, чтобы вы указали UTI заранее, чтобы получатель мог выбрать желаемое представление.

Последний - writeObjects - требует массива объектов, совместимых с NSPasteboardWriting, таких как вспомогательный класс NSPasteboardItem.

Проблема в том, что Finder интерпретирует любой URL-адрес, добавленный в монтажную панель, как буквальный URL-адрес, поэтому вместо перетаскивания файла он создает URL-адрес файла.

Нет способа (который я могу найти) создать NSPasteboardItem для URL. Это оставляет это (из шапки):

APPKIT_EXTERN NSString *NSFilenamesPboardType; //Deprecated
// Use -writeObjects: to write file URLs to the pasteboard

Однако, если вы смешаете URL с элементом NSPasteboard, результат не будет работать.

NSPasteboardItem *noteItem = [[[NSPasteboardItem alloc] init] autorelease];
[noteItem setString:theString forType:NSPasteboardTypeString];

//Here is the problem: you can only have one or the other, not both.
[pasteboard writeObjects:[NSArray arrayWithObjects:noteItem, nil]]; //A
[pasteboard writeObjects:[NSArray arrayWithObject:fileURL]]; //B
// A or B will work but not both
[pasteboard writeObjects:[NSArray arrayWithObjects:
fileURL, noteItem, nil]]; //Will not work

Я бы посчитал это отличным примером, если бы кто-то мог написать что-то, что бы выполнило оба эти требования вместе

Вот тест:

  • Перетащите в TextEdit должен вставить текст

  • Перетащите в Finder должен добавить файл.

1 ответ

writeObjects: это не единственный метод. Вы также можете использовать:

За NSURL у вас также есть возможность использовать дополнения NSURL (+URLFromPasteboard: а также -writeToPasteboard:).

Другие вопросы по тегам