无法在swift iOS 8扩展中投射UIImage

我有一个奇怪的问题,我试图build立一个行动扩展,将扫描提供的图像条形码。 这是代码。

override func viewDidLoad() { super.viewDidLoad() // Get the item[s] we're handling from the extension context. // For example, look for an image and place it into an image view. // Replace this with something appropriate for the type[s] your extension supports. var imageFound = false for item: AnyObject in self.extensionContext!.inputItems { let inputItem = item as NSExtensionItem for provider: AnyObject in inputItem.attachments! { let itemProvider = provider as NSItemProvider if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeImage as NSString) { // This is an image. We'll load it, then place it in our image view. weak var weakImageView = self.imageView itemProvider.loadItemForTypeIdentifier(kUTTypeImage as NSString, options: nil, completionHandler: { (image, error) in if image != nil { dispatch_async(dispatch_get_main_queue(),{ if let imageView = weakImageView { var imageToSet: UIImage? = image as? UIImage imageView.image = image as? UIImage } self.imageToScan = self.imageView.image self.scanFromImage(self.imageToScan!) }) } }) imageFound = true break } } if (imageFound) { // We only handle one image, so stop looking for more. break } } } 

现在,每当我尝试获得UIImage,我总是得到零,而在图像中,我可以看到一个图像被接收。 但是,当我尝试从该图像获取UIImage时,它总是返回nil。 这是从debugging可能帮助的屏幕截图

imageToSet安慰完整的镜头

更新:这是接收的图像的描述:

打印图像描述:(NSSecureCoding!)image =(instance_type = Builtin.RawPointer = 0x15d674c0 – > 0x32b6be5c(void *)0x32b6be70:NSURL)

我使用目标C创build了相同的扩展,它的工作原理,但不是很快。 这里是客观的C代码:

 - (void)viewDidLoad { [super viewDidLoad]; // Get the item[s] we're handling from the extension context. // For example, look for an image and place it into an image view. // Replace this with something appropriate for the type[s] your extension supports. BOOL imageFound = NO; for (NSExtensionItem *item in self.extensionContext.inputItems) { for (NSItemProvider *itemProvider in item.attachments) { if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) { // This is an image. We'll load it, then place it in our image view. __weak UIImageView *imageView = self.imageView; [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage options:nil completionHandler:^(UIImage *image, NSError *error) { if(image) { dispatch_async(dispatch_get_main_queue(), ^{ [imageView setImage:image]; imageToScan = image; [self scanImage:imageToScan]; }); } }]; imageFound = YES; break; } } if (imageFound) { // We only handle one image, so stop looking for more. break; } } 

}

我试图在Google上search很多,但什么都没发现。 我什至尝试了一个改变的代码,但没有工作,这里是改变的代码:

  itemProvider.loadItemForTypeIdentifier(kUTTypeImage as NSString, options: nil, completionHandler: { (image, error) in if image != nil { NSOperationQueue.mainQueue().addOperationWithBlock { if let imageView = weakImageView { var imageToSet: UIImage? = image as? UIImage imageView.image = image as? UIImage } self.imageToScan = self.imageView.image self.scanFromImage(self.imageToScan) } } }) 

更新:我注意到了一件事。 如果我创build一个新的项目并为其添加一个动作扩展,除了我在块中添加的几行之外,将自动生成相同的代码。 在这种情况下,甚至没有改变一行自动生成的代码,imageView.image是零。 这是一个错误在迅速? 或者我的Xcode应用程序的一些错误。

事情是这个图像不是UIImage ,它是NSURL

将代码更改为这一个:

 imageView.image = UIImage(data: NSData(contentsOfURL: image as NSURL)!)! 

你需要这样做

  if let strongImageView = weakImageView { if let imageURL = image as? NSURL{ strongImageView.image = UIImage(data:NSData(contentsOfURL: imageURL)!) }else{ strongImageView.image = image as? UIImage } } 

澄清,我加了完整的代码请参考,它为我工作

 override func viewDidLoad() { super.viewDidLoad() // Get the item[s] we're handling from the extension context. // For example, look for an image and place it into an image view. // Replace this with something appropriate for the type[s] your extension supports. var imageFound = false for item: AnyObject in self.extensionContext!.inputItems { let inputItem = item as! NSExtensionItem for provider: AnyObject in inputItem.attachments! { let itemProvider = provider as! NSItemProvider if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeImage as String) { // This is an image. We'll load it, then place it in our image view. weak var weakImageView = self.imageView itemProvider.loadItemForTypeIdentifier(kUTTypeImage as String, options: nil, completionHandler: { (image, error) in NSOperationQueue.mainQueue().addOperationWithBlock { if let strongImageView = weakImageView { if let imageURL = image as? NSURL{ strongImageView.image = UIImage(data:NSData(contentsOfURL: imageURL)!) }else{ strongImageView.image = image as? UIImage } } } }) imageFound = true break } } if (imageFound) { // We only handle one image, so stop looking for more. break } } } 

获取图像

 <UIImage: 0x16ecb410>, {100, 100} 

它不能像NSURL一样被转换成下面的expression式。

 imageView.image = UIImage(data: NSData(contentsOfURL: image as NSURL)!)!