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

Кажется, что новый интерфейс 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 Ответ

2 голосов
/ 15 июня 2011

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

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

...