While it may seem redundant, what if you specify the document type in the 
document attributes?  Also, you’re storing UTF8 data in the contents but 
specifying plain text; what if you specify it as UTF8 plain text?

Also, the source code for TextEdit is available somewhere; maybe try seeing 
what it’s doing.
--
Gary L. Wade
http://www.garywade.com/ <http://www.garywade.com/>

> On Nov 27, 2019, at 11:35 AM, Gary L. Wade via Cocoa-dev 
> <cocoa-dev@lists.apple.com> wrote:
> 
> You want to use a file wrapper rather than data and specify the document type 
> in the attributes as RTFD.
> --
> Gary L. Wade
> http://www.garywade.com/ <http://www.garywade.com/>
> 
>> On Nov 27, 2019, at 10:18 AM, Jeff Younker via Cocoa-dev 
>> <cocoa-dev@lists.apple.com> wrote:
>> 
>> I am having some difficulty with saving NSAttributedStrings as RTFD and
>> then recovering
>> them with attachments intact.  I generate a string containing an attachment
>> and turn that into
>> RTFD. When I turn that RTFD back into an NSAttributedString, I get the
>> .string back, and I
>> get an attachment, but the attachment's .contents is empty.
>> 
>> This is the smallest example I can come up with:
>> 
>> func testSaveAndRestoreAttachment() {
>> // Build up the string "deadbeef<attachment foobar>deadbeef"
>> let originalContent = "foobar".data(using: .utf8)
>> let originalAttachment = NSTextAttachment(
>>   data: originalContent, ofType: "public.plain-text")
>> let originalString = NSMutableAttributedString(string: "deadbeef")
>> originalString.append(NSMutableAttributedString(attachment:
>> originalAttachment))
>> originalString.append(NSMutableAttributedString(string: "deadbeef")
>> 
>> // save string as RTFD (note that generated RTFD contains "foobar"
>> inside.)
>> let savedRtfd = originalString.rtfd(from:
>> NSRange(0..<originalString.length))!
>> 
>> // Recover string
>> let recoveredString = NSAttributedString(rtfd: savedRtfd,
>> documentAttributes: nil)!
>> // Implementation of attachments() can be found below.
>> let recoveredAttachments = attachments(from: recoveredString)
>> // There *is* an attachment!
>> let recoveredAttachment = recoveredAttachments[0]
>> // Want to get Data("foobar") but actually get nil :(
>> XCTAssertNotNil(recoveredAttachment.contents)
>> }
>> 
>> When I print out the RTFD I can see the document includes the attachment
>> "foobar".
>> 
>> I'm assuming that I need to pass some additional information when I
>> call NSAttributedString(rtfd:,
>> documentAttributes:)
>> but I'm at a loss here.
>> 
>> Am I missing something simple? Perhaps a magical setting to be passed in
>> documentAttributes?
>> 
>> -jeff
>> 
>> 
>> 
>> ** This is the attachments() function used above:
>> 
>> func attachments(from s: NSAttributedString) -> Array<NSTextAttachment> {
>>   var attachments: Array<NSTextAttachment> = []
>>   s.enumerateAttribute(.attachment, in: NSRange(0..<s.length)) {
>>       value, range, stop in
>>       guard let a = value else {
>>          return
>>       }
>>       attachments.append(a as! NSTextAttachment)
>>   }
>>   return attachments
>> }
> 

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to