操作扩展loadItemForTypeIdentifier返回UIImage而不是NSURL

时间:2015-04-16 16:07:04

标签: ios swift ios8 uiimage

我正在开发一款可以显示图片元数据并在没有元数据的情况下共享图片的应用。我的应用程序还具有可以查看元数据的操作扩展。

当我尝试使用共享表在我的应用内共享图像,并选择我自己的应用的操作扩展时,我注意到 loadItemForTypeIdentifier 没有返回NSURL,而是给了我一个UIImage。无论如何我可以强制返回类型为NSURL吗?

if let itemProvider = extensionItem.attachments?[0] as? NSItemProvider {
    //println("\(itemProvider.description)")
    if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeImage as String) {
        // This is an image. We'll load it, then place it in our image view.
        itemProvider.loadItemForTypeIdentifier(kUTTypeImage as String, options: nil, completionHandler: { (item, error) -> Void in                    
            if let photoURL = item as? NSURL {
                NSOperationQueue.mainQueue().addOperationWithBlock {
                    self.fetchPhotoMetadata(photoURL)

                    let imageData = NSData(contentsOfURL: photoURL)
                    self.imageView.image = UIImage(data: imageData!)
                }
            } 
        })
    }

在Apple的文档中,它表示" item"

  

要加载的项目。指定块时,请设置类型   此参数为您想要的特定数据类型。例如,何时   请求文本数据,您可以将类型设置为NSString或   NSAttributedString。项目提供程序尝试强制数据   你指定的类。

当我尝试在闭包中指定返回类型为(item:NSURL!,error:NSError!) - >无效......,我收到以下错误

  

无法调用' loadItemForTypeIdentifier'参数列表   type'(String,options:nil,completionHandler:(NSURL!,NSError!) - >   空隙)'

    if let itemProvider = extensionItem.attachments?[0] as? NSItemProvider {
        //println("\(itemProvider.description)")
        if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeImage as String) {
            // This is an image. We'll load it, then place it in our image view.
            itemProvider.loadItemForTypeIdentifier(kUTTypeImage as String, options: nil, completionHandler: { (item: NSURL!, error: NSError!) -> Void in                    
                if let photoURL = item as? NSURL {
                    NSOperationQueue.mainQueue().addOperationWithBlock {
                        self.fetchPhotoMetadata(photoURL)

                        let imageData = NSData(contentsOfURL: photoURL)
                        self.imageView.image = UIImage(data: imageData!)
                    }
                } 
            })
        }

这里有没有人遇到过类似的问题?

2 个答案:

答案 0 :(得分:0)

共享附件似乎可以采用NSURL或UIImage的形式,具体取决于它的启动上下文。我从Monotouch port推断出这一点已被修改以处理这种可能性。遗憾的是original Apple sample code中没有这种变化。

注册共享扩展后,似乎优先调用此代码,而不是以前是注册文档类型入口点的application.openURL方法。这是在您自己的应用程序的上下文中调用的,可以更丰富地访问共享对象数据(因此是UIImage),而共享扩展似乎是基于主机应用程序写入某种沙盒DMZ的常见NSURL。

我确信这不是全部,但Apple文档令人沮丧地不透明。

答案 1 :(得分:0)

在这两个陈述中使用 kUTTypeURL 代替 kUTTypeImage

if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeURL as String) {
            // This is an image. We'll load it, then place it in our image view.
            itemProvider.loadItemForTypeIdentifier(kUTTypeURL as String, options: