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
相关产品推荐
相关产品推荐

