Скопируйте Вставьте NSAttributedString во внешнее приложение iOS

Новое в Swift и iOS. Я пытаюсь разрешить пользователю скопировать строку nsattributedstring в мое приложение и вставить ее в Mail, iMessage или любое другое приложение, которое он выберет.

@IBAction func action(sender: UIButton!) {

    let stringAttributes = [
        NSFontAttributeName: UIFont.boldSystemFontOfSize(14.0),
        NSBackgroundColorAttributeName: UIColor.redColor(),
    ]
    let attributedString = NSMutableAttributedString(string: "Hello world!", attributes: stringAttributes)

    do {
        let documentAttributes = [NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType]
        let rtfData = try attributedString.dataFromRange(NSMakeRange(0, attributedString.length), documentAttributes: documentAttributes)
        if let rtfString = String(data: rtfData, encoding: NSUTF8StringEncoding) {
            let pb = UIPasteboard.generalPasteboard()
            return pb.string = rtfString
        }
    }
    catch {
        print("error creating RTF from Attributed String")
    }
}

При вставке это возвращает:

Привет, мир!{ NSBackgroundColor = "UIDeviceRGBColorSpace 1 0 0 1";NSFont = " font-family:\".SFUIText-Semibold\"; font-weight: bold; font-style: normal; font-size: 14.00pt"; }

Отредактированный код возвращает:

{\ rtf1 \ ansi \ anscipg1252 {fontal \ f0 \ fnil \ fcharset0.SFUIText-Semibold;} {\ colortbl; \ red255 \ green255 \ blue255; \ red255 \ green0 \ blue0;} \ pard \ tx560 \ tx1120 \ tx1680... \ pardirnatural \ partightenfactor0 \ f0 \ b \ fs28 \ cf0 Привет, мир!

Проводя исследование, я наткнулся на этот ответ, но не смог заставить его работать из ответа Леонарда Паули. Может потому, что это только внутри приложения, а не вставляется в другое? Извините, если это дубликат этого вопроса. Вставить форматированный текст, а не изображения или HTML

Я также не мог перевести этот текст копирования с форматированием - iOS 6 NSAttributedString в Pasteboard для быстрого

Я могу вставить обычный текст, а не текст с любыми атрибутами.

2 ответа

для свифт 5

      func copyAttributedStringToPB() {

        let stringAttributes = [
            NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 14.0),
            NSAttributedString.Key.backgroundColor: UIColor.red,
        ]
        let attributedString = NSMutableAttributedString(string: "Hello world!", attributes: stringAttributes)

        do {
            let documentAttributes = [NSAttributedString.DocumentAttributeKey.documentType: NSAttributedString.DocumentType.rtf]
            let rtfData = try attributedString.data(from: NSMakeRange(0, attributedString.length), documentAttributes: documentAttributes)
            let pb = UIPasteboard.general
            pb.setData(rtfData, forPasteboardType: kUTTypeRTF as String)
        }
        catch {
            print("error creating RTF from Attributed String")
        }
    }

Я обновил ваш код, чтобы правильно сохранить данные RTF, которые вы создаете, на монтажном столе, однако загружая данные RTF и помещая их обратно в NSAttributedString объект, кажется, ручная задача.

Таким образом, поведение копирования и вставки будет работать только в тех случаях, когда разработчик явно поддерживал копирование и вставку данных RTF таким способом.

К сожалению, в игровых площадках, в которых я тестировал код, свойство строки в Pasteboard настроено так, чтобы содержать текстовую версию RTF-данных в виде текста (которая полна разметки и странных управляющих символов). Мне не удалось найти решение, которое решает эту проблему, а это означает, что приложения, которые не поддерживают RTF таким образом, могут по-прежнему вставлять размеченный открытый текст RTF вместо приписанного текста...:(

Это поможет вам в этом (в приложении копировать-вставить RTF), но, очевидно, не очень. Мои проекты также основаны на таком поведении, поэтому, если у кого-то есть дополнительные идеи, я также хотел бы знать.

import MobileCoreServices

   // ----- Copy ------ 
func copyAttributedStringToPB() {

    let stringAttributes = [
        NSFontAttributeName: UIFont.boldSystemFontOfSize(14.0),
        NSBackgroundColorAttributeName: UIColor.redColor(),
    ]
    let attributedString = NSMutableAttributedString(string: "Hello world!", attributes: stringAttributes)

    do {
        let documentAttributes = [NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType]
        let rtfData = try attributedString.dataFromRange(NSMakeRange(0, attributedString.length), documentAttributes: documentAttributes)
        let pb = UIPasteboard.generalPasteboard()
        pb.setData(rtfData, forPasteboardType: kUTTypeRTF as String)
    }
    catch {
        print("error creating RTF from Attributed String")
    }
}

  // -------- Paste -------
let pb = UIPasteboard.generalPasteboard()
let data = pb.dataForPasteboardType(kUTTypeRTF as String)

let pastedAttributedString = try! NSAttributedString(data: data!, options: [NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType], documentAttributes: nil)
Другие вопросы по тегам