#cocoa #clipboard #nspasteboard #uti
#cocoa #буфер обмена #nspasteboard #uti
Вопрос:
У меня есть форматированный текстовый файл с несколькими изображениями и текстом. В моем приложении Cocoa я пытаюсь поместить содержимое этого файла в NSDragPboard
, чтобы пользователь мог перетаскивать содержимое в другие приложения (TextEdit, Mail и т.д.).
Один из вариантов использования заключается в следующем: форматированный текстовый файл содержит шаблон электронной почты, и пользователь перетаскивает содержимое в новое почтовое сообщение.
Я пробовал это без успеха:
NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
[pboard writeFileContents:filePath];
В документах Apple говорится об этом:
Записывает содержимое имени файла в получатель и объявляет, что данные имеют тип NSFileContentsPboardType, а также тип, соответствующий расширению файла (который возвращается функцией NSCreateFileContentsPboardType при передаче расширения файлов), если оно у него есть.
В приложении ClipboardViewer я вижу несколько типов данных, одним из которых является NXFileContentsPboardType
. Однако такие приложения, как Mail и TextEdit, не позволяют удалять этот тип данных.
Когда я копирую форматированный текстовый контент в буфер обмена вручную (Control C), я вижу все различные типы данных, которые я хочу:
public.rtf
public.utf8-plain-text
NSStringPboardType
- …
Итак, как я могу сделать это программно самостоятельно? Должен ли я вычислять все различные типы UTI и устанавливать соответствующие данные? Я думал, что для этого [pboard writeFileContents:path]
и было…
Спасибо, Марк.
Редактировать:
Есть прогресс… Это работает для .rtf
файлов, но не для .txt
файлов:
NSString *uti = // helper code to get UTI from NSURL resource key...
NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
[pboard declareTypes:[NSArray arrayWithObject:uti] owner:nil];
[pboard setData:[NSData dataWithContentsOfFile:filePath] forType:uti];
Для .txt
файлов тип данных на картоне является public.text
. Однако TextEdit и Mail.app не позволят удалить этот тип. public.rtf
в случае форматированного текста работает нормально…
Ответ №1:
Похоже, что невозможно добавить содержимое файла на pasteboard и автоматически определить типы содержимого.
Оказывается, поместить содержимое файла RTF / RTFD на картонную упаковку так же просто, как:
NSAttributedString *contents = [[NSAttributedString alloc] initWithPath:filePath documentAttributes:NULL];
// This sets the correct type automatically:
[pboard writeObjects:[NSArray arrayWithObject:contents]];
[contents release];