在 UIPasteBoard 中复制 NSAttributedString

2024-02-16

如何在粘贴板中复制 NSAttributedString,允许用户粘贴或以编程方式粘贴(使用- (void)paste:(id)sender,来自 UIResponderStandardEditActions 协议)。

I tried:

UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
[pasteBoard setValue:attributedString forPasteboardType:(NSString *)kUTTypeRTF];

但这次崩溃:

-[UIPasteboard setValue:forPasteboardType:]: value is not a valid property list type'

这是可以预料的,因为 NSAttributedString 不是属性列表值。

如果用户将粘贴板的内容粘贴到我的应用程序中,我想保留属性字符串的所有标准和自定义属性。


干净的解决方案不是涉及 HTML,而是将 NSAttributedString 作为 RTF(加上纯文本后备)插入粘贴板:

- (void)setAttributedString:(NSAttributedString *)attributedString {
    NSData *rtf = [attributedString dataFromRange:NSMakeRange(0, attributedString.length)
                               documentAttributes:@{NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType}
                                            error:nil];
    self.items = @[@{(id)kUTTypeRTF: [[NSString alloc] initWithData:rtf encoding:NSUTF8StringEncoding],
                     (id)kUTTypeUTF8PlainText: attributedString.string}];
}

Swift 5

import MobileCoreServices

public extension UIPasteboard {
    func set(attributedString: NSAttributedString) {
        do {
            let rtf = try attributedString.data(from: NSMakeRange(0, attributedString.length), documentAttributes: [NSAttributedString.DocumentAttributeKey.documentType: NSAttributedString.DocumentType.rtf])
            items = [[kUTTypeRTF as String: NSString(data: rtf, encoding: String.Encoding.utf8.rawValue)!, kUTTypeUTF8PlainText as String: attributedString.string]]
        } catch {
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 UIPasteBoard 中复制 NSAttributedString 的相关文章

随机推荐

  • Android向viewpager添加了圆圈指示器[重复]

    这个问题在这里已经有答案了 您好 我创建了一个视图寻呼机 但有谁知道我如何在页面视图上显示代表分页的圆圈 我认为它提供了一个指示器 但我不完全确定 这是迄今为止包含我的视图寻呼机的代码 public class LevelSelect ex
  • TFS 与 VSTS 的未来

    微软还在开发这两种产品吗 TFS 的开发是否已被放弃而转而支持 VSTS 就上下文而言 我们现在正在使用 TFS 而 VSTS 显然具有更好的集成性 特别是 Microsoft Teams 和 ZenDesk 这对于让我们的工作流程处于更易
  • (Android)如何填充ListView背景并保持标题透明度

    我有一个自定义图像背景 它填充 ListView 后面的整个屏幕 ListView 有一个包含一些数据的标题 然后是一个透明的 10dp 边距 允许我们看到一点背景图像 然后是更多数据 在这个标题下方 在 ListView 的 主体 中 我
  • Laravel 4 查询生成器 - 具有复杂的左连接

    我是 Laravel 4 的新手 我有这样的疑问 SELECT a id active name email img location IFNULL b Total 0 AS LeadTotal IFNULL c Total 0 AS In
  • 使用新的用户名和密码更新 vsts-npm-auth

    我已经安装了vsts npm auth使用以下命令进行打包 npm install g vsts npm auth registry https registry npmjs com 我跑了vsts npm auth config npmr
  • Nuget 4安装在哪里

    Visual Studio 2017 附带 Nuget 4 0 0 但是 它没有放置在路径上 在哪里可以找到使用 CLI 的 nuget 可执行文件 视觉工作室 2017不使用NuGet exe而是使用扩展名NuGet为了达成这个 您应该能
  • 正则表达式解析CSS选择器

    我想解析这个 CSS 选择器 以及其他类似形式的选择器 div class1 myid class2 key value 并让它匹配 class1 和 class2 但我不知道要使用什么正则表达式 例子 http www rubular c
  • 使用 gitlab runner 安装 hostpah 卷的正确方法是什么?

    我需要创建一个卷来公开 maven m2 文件夹 以便在我的所有项目中重用 但我根本无法做到这一点 我的 gitlab 运行程序作为容器在我的 kubernetes 集群中运行 遵循部署和配置图 apiVersion extensions
  • 如何使用 Ms Access 日期/时间扩展数据类型

    访问女士表明有一种名为 日期 时间扩展 的数据类型 其中 日期 时间扩展数据类型存储日期和时间信息 与日期 时间数据类型类似 但它提供更大的日期范围 更高的小数精度以及与 SQL Server datetime2 日期类型的兼容性 但是 我
  • 将一个目录和子目录中的所有文件复制到单个位置[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 以下是将所有 txt 文件从一个位置复制到另一个位置的代码
  • 使用 Objective-C/Cocoa 启动 Mac 应用程序

    使用命令行启动路径查找器应用程序时 我使用open a Path Finder app Users 基于这个想法 我使用以下代码来启动路径查找器 我可以在不使用的情况下启动应用程序吗open命令行 NSTask task task NSTa
  • 恒定值变化

    假设我有一个结构体定义 struct thing thing x int z thing x this z 0 void foo const this gt x gt z 请注意 我创建了一个指向我自己的可变指针 邪恶的笑 然后我可以像这样
  • React Router v4 - 使用不同的查询参数重定向到相同的路由

    设想 有一个主页 搜索用户将被重定向到带有查询参数 例如 q abc 的搜索页面 现在在搜索页面上 用户再次尝试搜索不同的值 因此他再次被重定向到相同的搜索页面 但具有不同的查询参数 例如 q xyz Problem 当我尝试使用不同的查询
  • 嵌套 mybatis 映射

    我不知道如何在复杂的对象中使用 mybatis 结果 我有以下映射器类 public interface StationMapper MapKey stationId Map
  • Hibernate 根据条件选择顶部和底部 n 行

    假设我有两个表 书籍和评论 评论有一个列 星星 其值可以在 1 到 5 之间 一本书可以有许多评论 我如何选择所有书籍 以便使用 Criteria API 仅返回每本书的顶部和底部 3 条评论 而不是所有评论 如果 Criteria API
  • 有没有好的 jQuery 拖放文件上传插件? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在react-native-webview中保持最后一个网络会话处于活动状态?

    我正在开发一个应用程序 在该应用程序中我需要使用户的最后一个网络会话保持活动状态react native webview 这是所需的工作流程 我的应用程序只有一个 WebView 其中有固定的 url 正在加载 用户将打开应用程序并登录该网
  • 根据文件的扩展名将文件移动到适当的位置

    我有一个清理脚本 可以根据文件的扩展名将文件移动到适当的预设位置 例如 扩展名为 xls 的文件将被移动到 XLS 文件夹 sql 会被移动到 SQL 文件夹 依此类推 这是我的脚本 dirtyfolder server c Documen
  • 使用 lxml.etree 移动整个元素

    在 lxml 中 给定一个元素 是否可以将整个元素移动到 xml 文档中的其他位置 而不必读取它的所有子元素并重新创建它 我最好的例子就是改变父母 我翻阅了一些文档 但运气不佳 提前致谢 append insert和其他操作默认执行此操作
  • 在 UIPasteBoard 中复制 NSAttributedString

    如何在粘贴板中复制 NSAttributedString 允许用户粘贴或以编程方式粘贴 使用 void paste id sender 来自 UIResponderStandardEditActions 协议 I tried UIPaste