Помещение содержимого файла на NSPasteboard с использованием UTI, а не NSFileContentsPboardType? - PullRequest
0 голосов
/ 17 мая 2011

У меня есть текстовый файл с несколькими изображениями и текстом. В моем приложении Какао я пытаюсь поместить содержимое этого файла в 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] было для ...

Спасибо, Марк.

EDIT:

Добиться прогресса ... Это работает для .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 Ответ

1 голос
/ 20 мая 2011

Похоже, что невозможно добавить содержимое файла в монтажную панель и автоматически определить типы содержимого.

Оказывается, что поместить содержимое файла RTF / RTFD на монтажную панель так же просто, как:

NSAttributedString *contents = [[NSAttributedString alloc] initWithPath:filePath documentAttributes:NULL];
// This sets the correct type automatically:
[pboard writeObjects:[NSArray arrayWithObject:contents]];
[contents release];
...