You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4中复制带自定义字体的NSAttributedString到剪贴板后无法粘贴求助

解决Swift 4中复制带自定义字体的NSAttributedString到剪贴板后无法粘贴的问题

我来帮你搞定这个问题!你的代码已经成功生成了RTF数据,但只给剪贴板设置了RTF一种类型,很多应用可能无法正确识别,另外还有几个细节可以优化,确保跨应用粘贴正常工作:

问题分析

你打印的RTF内容看起来是正确的,但其他应用粘贴无内容,核心原因是剪贴板只提供了单一的RTF格式,部分应用可能更兼容kUTTypeRichText(富文本格式)或者需要纯文本作为保底选项;另外,未处理字体和字符串的空值情况也可能隐藏潜在问题。

修正后的代码

首先确保导入MobileCoreServices框架(因为用到了kUTTypeRTF这类UTI常量),然后用下面的代码替换你的实现:

import MobileCoreServices

// 安全解包字符串和选中的字体,避免崩溃
guard let targetString = myString, 
      let customFont = UIFont(name: listOfFonts[indexPath.row], size: 15) else {
    print("Error: String or selected font is nil")
    return
}

// 创建带自定义字体的富文本
let attributedString = NSAttributedString(string: targetString, attributes: [.font: customFont])

do {
    // 生成RTF格式数据
    let rtfData = try attributedString.data(
        from: NSRange(location: 0, length: attributedString.length),
        documentAttributes: [.documentType: NSAttributedString.DocumentType.rtf]
    )
    
    let pasteboard = UIPasteboard.general
    // 同时设置多种剪贴板格式,覆盖不同应用的兼容需求
    pasteboard.setData(rtfData, forPasteboardType: kUTTypeRTF as String)
    pasteboard.setData(rtfData, forPasteboardType: kUTTypeRichText as String)
    pasteboard.string = targetString // 添加纯文本作为保底选项
    
    print("Successfully copied formatted text to clipboard!")
    print("RTF Preview: \(String(data: rtfData, encoding: .utf8) ?? "Invalid RTF")")
} catch {
    print("Failed to generate RTF data: \(error.localizedDescription)")
}

关键优化点

  • 多格式剪贴板设置:同时添加kUTTypeRTF、kUTTypeRichText和纯文本类型,确保不同应用都能找到自己支持的格式,避免无内容粘贴的情况。
  • 安全解包:用guard语句处理myString和字体的空值情况,防止意外崩溃。
  • 完善的错误处理:捕获生成RTF数据时的异常,方便调试问题。

额外兼容性优化(可选)

如果部分应用还是无法识别RTF,可以尝试同时添加RTFD格式(带资源附件的富文本):

// 生成RTFD格式数据
let rtfdData = try attributedString.data(
    from: NSRange(location: 0, length: attributedString.length),
    documentAttributes: [.documentType: NSAttributedString.DocumentType.rtfd]
)
pasteboard.setData(rtfdData, forPasteboardType: kUTTypeRTFD as String)

这样调整后,你应该能在其他应用中正常粘贴带自定义字体的格式化文本了,如果还是有问题,可以检查目标应用是否支持富文本粘贴(比如有些纯文本编辑器只能粘贴纯文本)。

内容的提问来源于stack exchange,提问作者Jacob Perks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:08:02