如何获取 NSItemProvider 提供的实际数据/内容而不是类型

Posted

技术标签:

【中文标题】如何获取 NSItemProvider 提供的实际数据/内容而不是类型【英文标题】:How to get actual data/content provided by NSItemProvider rather than the type 【发布时间】:2019-10-14 14:38:27 【问题描述】:

我是 ios 11 拖放功能的新手。我知道如何在可以接受该类型对象的视图中加载特定类型的对象。但是,在调用loadObject(ofClass:completionHandler:) 之前,我想知道被丢弃的项目所持有的值。

在我的dropInteraction(_:performDrop:)委托方法中,当我尝试获取itemProvider对象的描述时,我只得到了类型-

func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) 

        if let itemProvider = session.items.last?.itemProvider
            print("item provider \(itemProvider.description)")
        

当我从 safari 中删除图像时,打印了上面的代码 -

item provider <UIItemProvider: 0x600000c43640> types = (
    "public.jpeg",
    "public.url"
)

在这里我看不到 url 值。如果我想获取 url 值,我必须这样做-

func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) 

    session.items.last?.itemProvider.loadObject(ofClass: URL.self, completionHandler:  itemProvider, err in
      if let urlItemProvider = itemProvider
          print("url = \(urlItemProvider.absoluteString)")
      
  )

基本上,每当删除图像时,我想在尝试加载图像之前将其关联的 url 和有关图像的详细信息保存在自定义类中。任何帮助将不胜感激。

【问题讨论】:

您的问题到底是什么?看来你已经想通了 和ItemProvider的内容类型一样,有没有办法获取这些类型的关联值? 这不正是loadObject(ofClass:completionHandler:) 正在做的事情吗? 对于 loadObject,我明确要求一个特定的类。最重要的是,我正在尝试加载资源。我想保存资源并根据某些条件加载该资源。这就是为什么我不想调用 loadObject(ofClass:completionHandler:) 除非我真的想使用那个特定的资源。但是,经过一番挖掘,我想,可能没有任何替代方法。 我忘记了这一点,我想你现在已经解决了你的问题。问题是类型标识符和NSItemProviderReading 类之间存在多对多关系(请参阅NSItemProviderReading.readableTypeIdentifiersForItemProvider。这意味着给定类型标识符,没有“合理的默认”类来处理它,因为有是可以使用的多个同等有效的类,具体取决于具体情况。这就是为什么明确要求您提供所需的类。 【参考方案1】:

我发现用 loadObject 方法加载两个对象总是会出错。但是,使用 .copy() 方法复制 itemProvider 是可行的。

例如:

let provider = item.dragItem.itemProvider.copy() as! NSItemProvider
item.dragItem.itemProvider.loadObject(ofClass: URL.self, completionHandler:  (url, _) in
    provider.loadObject(ofClass: String.self)  (data, error) in
    
)

【讨论】:

以上是关于如何获取 NSItemProvider 提供的实际数据/内容而不是类型的主要内容,如果未能解决你的问题,请参考以下文章

从 NSItemProvider 获取文件名/路径

iOS8 扩展 NSItemProvider UIImage 通过 ALAssetsLibrary 到 ALAsset

在 Share Extension (Swift) 中处理 NSItemProvider 数据类型

拖放 - 从我的模型创建一个 NSItemProvider

如何从 PHPickerViewController 委托获取实时照片或视频

iOS 14 NSItemProvider loadDataRepresentation() 返回指定类型的 nil 数据