使用UIImagePickerController创建未知类型的图像格式是错误的。

76

在iOS 10 Swift 3中从图片选择器中选择图片时,我遇到了一个错误 - 创建未知类型的图像格式是错误的

 func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {

    imagePost.image = image
    self.dismiss(animated: true, completion: nil)
}
图像未被选择和更新。我需要帮助或建议,了解在iOS10或Swift 3中是否更改了此方法的语法或任何内容,或者是否有其他方法可以实现这一点。

8
е°†didFinishPickingMediaWithInfo info: [String : AnyObject]дё­зљ„AnyObjectж”№дёєAnyгЂ‚ - Leo Dabus
2
你应该让Xcode自动完成它。我认为你正在使用的方法已经过时了。 - Leo Dabus
1
谢谢Leo,确实是一个有帮助的评论。 - Jeet
5
我也有同样的问题,而 "String: Any" 似乎并没有帮助。 - TheBen
1
我也遇到了同样的问题。返回的数据是有效的UIImage,因为我能够将其保存到我的服务器并在那里正确显示。但它就是无法加载到UIImageView中。 - Jochem Toolenaar
显示剩余5条评论
23个回答

28

以下提到的代码确实为我解决了这个问题 -

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        imagePost.image = image
    } else{
        print("Something went wrong")
    }

    self.dismiss(animated: true, completion: nil)
}

21
这对我来说并没有解决问题。我更新了函数,但仍然在调用该函数时立即收到错误消息。之后使用UIImage也无法工作。 - Tim
3
@Tim 我仍然收到错误提示,但是可以正常访问图像。 - MobileVet
1
@jeetendra,这确实解决了我的问题,但它仍然会给我一个警告:“实例方法(didFinishPickingMediaWithInfo)几乎与其可选要求匹配。”当我在函数之前添加private或nonobjc时,警告消失了,但该方法却没有被调用。 - Arpit Dhamane
1
虽然这确实帮助我解决了图像无法显示的问题,但错误仍然会在控制台中出现。还是谢谢。 - Arjun Kalidas
我同意@KrugerBrent的观点,这解决了图像不显示的问题,但控制台中的错误仍然存在。 - waseefakhtar
显示剩余4条评论

11

记得将代理添加到self

let picker = UIImagePickerController()
picker.delegate = self // delegate added

哈,你救了我。Xcode 7 可以在没有委托分配的情况下编译和正常运行... 真是疯狂。 - MobileVet

10

以下代码解决了问题:

如果用户对所选图像进行更改,则仅拉取该图像,否则拉取原始图像源而没有任何更改,并最终关闭图像选择器视图控制器。

public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]){
    if let image = info[UIImagePickerControllerEditedImage] as? UIImage {
        imageView.image = image
    }
    else if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        imageView.image = image
    } else{
        print("Something went wrong")
    }

    self.dismiss(animated: true, completion: nil)
}

2
欢迎来到 Stack Overflow!仅有代码的答案本身并不是非常有用。如果您能添加一些详细说明它如何/为什么回答了问题,那将会很有帮助。 - Jeet
这应该是正确的答案。运行非常流畅。 - user3286381

7
如果您允许编辑图片 imageController.allowsEditing = true,那么您需要先获取编辑后的图片:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    picker.dismissViewControllerAnimated(true, completion: nil)

    if let image = info[UIImagePickerControllerEditedImage] as? UIImage {
        imagePost.image = image
    } else if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        imagePost.image = image
    } else {
        imagePost.image = nil
    }
}

我已经实现了您的回答,但仍然出现错误。您能否请阅读我的问题 https://stackoverflow.com/questions/50189732 - bibscy

5
Jeetendra Choudhary提供的已被接受的解决方案是有效的。但是,在使用Swift3的Xcode 8中,我注意到会出现警告: Instance method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' nearly matches optional requirement 'imagePickerController(_:didFinishPickingMediaWithInfo:)' of protocol 'UIImagePickerControllerDelegate'

enter image description here

建议添加@nonobjcprivate关键字来消除警告。但是,如果按照这些建议静默警告,则该解决方案将不再起作用。

谢谢澄清,很有道理。 - Jeet
1
问题出在“AnyObject”上——正确的Swift 3签名使用“Any”。不要使用Xcode建议的解决方案来消除警告。 - Zig

5

我发现照片库中的默认图片可能会引起这个问题。 如果您从计算机上拖动图像到模拟器并选择它,则可以解决此问题。


3

根据Abdurohman的回答,我修改了代码并解决了问题,谢谢。

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage

    photoImageView.image = selectedImage

    // Dismiss the picker.
    dismiss(animated: true, completion: nil)
}

那是唯一在Swift 3.0中对我有用的代码。谢谢! - fraxool

2

将以下内容添加到viewDidLoad()方法中:

imagepicker.delegate = self

1
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        imgViewPhoto.image = image
    } else{
        print("Something went wrong")
    }

    picker.dismiss(animated: true, completion: nil)

}

1
didFinishPickingMediaWithInfo info: [String : AnyObject] 修改为 didFinishPickingMediaWithInfo info: [String : Any]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接