Размещение содержимого файла на NSPasteboard с использованием UTI, а не NSFileContentsPboardType?

#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];