Приписанная строка теряет вложение в вставку из картона - PullRequest
3 голосов
/ 16 марта 2012

Я потратил довольно много дней на поиски решения для размещения атрибутивной строки с вложением на NSPasteboard.

Я могу прочитать RTFD-файл с вложениями, изменить его текст и атрибуты, а затем поместить его на NSPasteboard для использования в других приложениях (например, Mail.app), и это прекрасно работает.Но то, что я хотел бы сделать, это также добавить изображение в какой-то момент в тексте.Я могу сделать это с помощью текста в виде приписанных строк, но если я попытаюсь вставить изображение (в качестве вложения в приписанную строку), изображение никогда не появится (хотя остальное происходит).

Похоже, что RTFD выпускается в разных вариантах, и тот, который мне нужен, сериализуется.Я пробовал много вариантов объявленных типов NSPasteboard, даже используя FileWrappers, но должно быть упущено что-то важное.Независимо от того, что я делаю, вложение никогда не приходит.

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

Вот пример кода:

Создайте приписанную строку с некоторым текстом, затем добавьте прикрепленное изображение, затем немного больше текста, отобразите его в textView (все работает), затем загрузитевставить и вставить в textEdit или Mail ... прикрепленного изображения нет, хотя остальное есть:

// get the image
NSImage *myImage = [[NSImage alloc] initWithData:  [window dataWithPDFInsideRect:[theImage frame]]];

// set the image as an attachment
NSTextAttachment     *myAttachment  = [[NSTextAttachment alloc] init];
NSTextAttachmentCell *myAttachmentCell = [[NSTextAttachmentCell alloc] initImageCell:myImage];
[myAttachment setAttachmentCell:myAttachmentCell];

// put image inside attributed string
NSAttributedString *myImageString = [NSAttributedString attributedStringWithAttachment:myAttachment] ;


// make an attributes dictionary (simply makes text blue) as an example
NSDictionary *myAttributesDict = [NSDictionary dictionaryWithObjectsAndKeys:
                                 [NSColor blueColor], NSForegroundColorAttributeName,
                                 nil];

// and add some beginning text
NSMutableAttributedString *theCombinedString = [[NSMutableAttributedString alloc]  initWithString:[NSString stringWithFormat:@"Here's an image we just grabbed: \n\n"]  attributes:myAttributesDict];


// now append our attached image 
[theCombinedString appendAttributedString:myImageString];


// and add some following text as an example
NSMutableAttributedString *endString = [[NSMutableAttributedString alloc]  initWithString:[NSString stringWithFormat:@"\n\n How about that!\n"]  attributes:myAttributesDict];


// and stick it all together
[theCombinedString appendAttributedString: endString];


// now display it in a textView to make sure we have something 
[[junkTextView textStorage] appendAttributedString: theCombinedString];



/// --- works just fine to here --- ///



// the following loads the pastboard, including the added text, but for some reason, leaves out the above attachment 

NSPasteboard *thePboard = [NSPasteboard generalPasteboard];
[thePboard clearContents];

NSAttributedString *theContents = [[NSAttributedString alloc] theCombinedString ];

[thePboard writeObjects:[NSArray arrayWithObject:theContents]];


// pasting into mail or textEdit shows the above before and after text, but not the image.  

Есть идеи?

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

Это моя первая публикация здесь, поэтому, пожалуйста, извините за любые ошибки форматирования - я выучу, и большое спасибо за любые указатели или помощь, даже если это RTFM, который я сделал, но мог иметьнеправильно поняли.

1 Ответ

7 голосов
/ 19 марта 2012

Наконец-то нашел решение, и в конце концов это был Обертка. Вот код для всех, кто интересуется, работает с изображением, прочитанным из файла или взятым из вашего приложения:

// make a file wrapper
NSFileWrapper* wrapper =[[NSFileWrapper alloc] initRegularFileWithContents:[theImage TIFFRepresentationUsingCompression:NSTIFFCompressionLZW factor:1]];

// -must- have this.  used to save your pasted file in some apps
[wrapper setPreferredFilename:@"yourImage.tiff"];
//
NSAttributedString* imageString = [NSAttributedString attributedStringWithAttachment:[[NSTextAttachment alloc] initWithFileWrapper:wrapper]];

// then load pasteboard and paste wherever you wish.  You can get fancier using private 
// pasteboards and custom data types, of course.  This is just a simple example.
...