Несколько типов на монтажном столе, включая файлы, 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:
).