【发布时间】:2020-04-10 07:47:45
【问题描述】:
我的应用程序的主要数据结构符合“可编码”协议,并且可以使用它来将其数据序列化到 JSON 或从 JSON 序列化。当用户在 UIActivityViewController 中选择“复制”时,我希望能够将这些数据包含在通用粘贴板 (UIPasteboard.general) 中。
但是,我不知道该怎么做。将 JSON 作为数据或字符串或字典添加到活动控制器的项目中没有帮助。打印粘贴板项目的类型只会显示您对属性字符串的期望:
["com.apple.uikit.attributedstring", "com.apple.rtfd", "com.apple.flat-rtfd", "public.utf8-plain-text"]
根据UIActivity.ActivityType.copyToPasteboard的文档:
使用此服务时,您可以提供 NSString、UIImage、NSURL、UIColor 和 NSDictionary 对象作为活动项的数据。
所以我曾期望在“项目”中包含字典会自动将字典项目添加到粘贴板(将字典键作为粘贴板项目类型)。但这在这种情况下似乎不起作用,即使我只使用一个简单的 [String:String] 字典。
我正在尝试的代码如下。
func shareStuff() {
let attrString = someThing.attrString()
let printer = CustomPrintPageRenderer(someThing)
var pasteboardDict: [String:Any] = [:]
let jsonEncoder = JSONEncoder()
jsonEncoder.outputFormatting = .prettyPrinted
let jsonData = try? jsonEncoder.encode(someThing)
let jsonString = String(data: jsonData!, encoding: .utf8)
print(jsonString!)
if jsonData != nil {
pasteboardDict["jsonData"] = jsonData
if jsonString != nil {
pasteboardDict["jsonString"] = jsonString
}
}
let items = [printer, attrString, pasteboardDict] as [Any]
let activity = UIActivityViewController(activityItems: items, applicationActivities: nil)
present(activity, animated: true)
}
我也尝试在“items”中包含“self”并使用“UIActivityItemSource”协议,但这似乎对粘贴板上的内容也没有任何影响(我已经确认返回的行字典确实被调用):
func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
if activityType == .copyToPasteboard {
return ["blah": "some stuff"]
} else {
return nil
}
}
有没有办法使用 UIActivityViewController 的“复制”活动向粘贴板添加额外的类型?
或者我是否必须在活动视图控制器之外创建自己的单独“复制”操作(并从活动控制器中排除“copyToPasteboard”以避免混淆)?
【问题讨论】:
标签: swift copy uiactivityviewcontroller uipasteboard