【问题标题】:UIActivityViewController to add additional types to UIPasteboard for 'copyToPasteboard' actionUIActivityViewController 为 UIPasteboard 添加其他类型以进行“copyToPasteboard”操作
【发布时间】: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


    【解决方案1】:

    我找到了一个解决方案,我的“粘贴”过程现在识别出粘贴板上现在同时存在“jsonData”和“jsonString”,以及属性字符串和纯文本。

    我必须将“self”作为唯一的项目,而不是在“items”中添加“self”。然后我可以定义协议函数返回哪些项目:

        func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
            guard let recipe = recipe else { return nil }
            let attrString = someThing.attrString()
            switch activityType {
            case UIActivity.ActivityType.print:
                return SomePrintPageRenderer(someThing)
            case UIActivity.ActivityType.copyToPasteboard:
                var pasteboardDict: [String:Any] = attrString.pasteables()
                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
                    }
                }
                return pasteboardDict
            default:
                return attrString
            }
        }
    

    请注意,我还必须明确处理包含我仍然需要的各种普通和属性字符串粘贴板类型。 (这是通过自定义 NSAttributedString 扩展完成的,该扩展具有函数“pasteables()”,该函数返回属性字符串的可粘贴版本的字典。)

    【讨论】:

      猜你喜欢
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 2011-11-26
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 2013-06-22
      相关资源
      最近更新 更多