Colocar o conteúdo de um arquivo no NSPasteboard usando UTI e não NSFileContentsPboardType?

StackOverflow https://stackoverflow.com/questions/6030240

Pergunta

Eu tenho um arquivo rich text com algumas imagens e texto.No meu aplicativo Cocoa, estou tentando colocar o conteúdo desse arquivo no NSDragPboard para que o usuário possa arrastar o conteúdo em outros aplicativos (TextEdit, Mail, etc.).

Um caso de uso é este:o arquivo rich text contém um modelo de email e o usuário arrasta o conteúdo para uma nova mensagem do Mail.

Eu tentei isso sem sucesso:

NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
[pboard writeFileContents:filePath];

Os documentos da Apple dizem o seguinte:

Grava o conteúdo do nome do arquivo para o receptor e declara os dados como do tipo NSFileContentsPboardType e também de um tipo apropriado para a extensão do arquivo (conforme retornado pela função NSCReateFileContentsPboardType quando passou a extensão dos arquivos), se houver um.

No aplicativo ClipboardViewer posso ver alguns tipos de dados, sendo um deles NXFileContentsPboardType.No entanto, aplicativos como Mail e TextEdit não permitem descartar esse tipo de dados.

Quando copio manualmente o conteúdo rich text para a área de transferência (Control + C), vejo todos os diferentes tipos de dados que desejo:

  • public.rtf
  • public.utf8-plain-text
  • NSStringPboardType
  • ...

Então, como posso fazer isso programaticamente?Preciso descobrir todos os vários tipos de UTI e definir os dados correspondentes?Eu pensei que era isso [pboard writeFileContents:path] era para...

Obrigado, Marcos.

EDITAR:

Fazendo progresso...Isso funciona para .rtf arquivos, mas não para .txt arquivos:

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

Para .txt arquivos, o tipo de dados na área de transferência é public.text.No entanto, TextEdit e Mail.app não permitem descartar esse tipo. public.rtf no caso de rich text funciona bem ...

Foi útil?

Solução

Parece que não é possível adicionar o conteúdo do arquivo à área de transferência e fazer com que os tipos de conteúdo sejam detectados automaticamente.

Acontece que colocar o conteúdo do arquivo RTF/RTFD na área de transferência é tão simples quanto:

NSAttributedString *contents = [[NSAttributedString alloc] initWithPath:filePath documentAttributes:NULL];
// This sets the correct type automatically:
[pboard writeObjects:[NSArray arrayWithObject:contents]];
[contents release];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top