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