UIImageView未显示通过UIIMagePickerController选择的图像

时间:2016-11-16 15:07:13

标签: swift uiimageview uiimagepickercontroller

我正在尝试使用UIImagePickerController选择图像。我有以下代码,其中有一个UIImageView的IBOutlet。

在didFinishPickingMediaWithInfo中选择图像后,我在内存中获取图像,但不知何故,它在imageview中不可见。我确实尝试在didFinishPickingMediaWithInfo中更改静态图像以进行imageview,但它也没有显示图像。代码如下,

class SnapshotViewController: UIViewController,UINavigationControllerDelegate, UIImagePickerControllerDelegate
{
    @IBOutlet var imageView: UIImageView!
    @IBAction func takePhoto(sender: AnyObject) {
      let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = .PhotoLibrary
        imagePicker.allowsEditing = false
        presentViewController(imagePicker, animated: true, completion: nil)
    }


    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

        dismissViewControllerAnimated(true, completion: nil)
        dispatch_async(dispatch_get_main_queue())
        {
            let image = info[UIImagePickerControllerOriginalImage] as? UIImage
            self.imageView.image = image
        }
    }
}

我想这是一般性问题,无论我在didFinishPickingMediaWithInfo中为此imageView更改的图像都无效。如果我在viewDidLoad中更改imageView图像,那么它的工作原理。 任何人都可以请求帮助,因为我需要显示通过照片库选择的图像?

3 个答案:

答案 0 :(得分:0)

强烈建议不要从后台线程更新UI控件。这可能是奇怪的行为和崩溃的原因,有时很难识别。

尝试在主线程上设置图像:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

    let image = info[UIImagePickerControllerOriginalImage] as? UIImage
    self.imageView.image = image

    dismissViewControllerAnimated(true, completion: nil)
}

答案 1 :(得分:0)

我认为此代码可以解决您的问题并使您的照片库中的照片显示出来:

class PostViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {



    @IBOutlet var imageToPost: UIImageView!

    @IBAction func chooseAnImage(_ sender: AnyObject) {

        let imagePicker = UIImagePickerController()

        imagePicker.delegate = self

        imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary

        imagePicker.allowsEditing = false

        self.present(imagePicker, animated: true, completion: nil)

    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

        if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {

            imageToPost.image = image


        }

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

    }

答案 2 :(得分:0)

在很快的4中,我尝试了各种方法,但是直到我仅向@objc覆盖方法中添加didFinishPickingMediaWithInfo注释后,它们才起作用:

输入UIImagePickerController

@objc func handleSelectProfileImageView () {
        let pickerController = UIImagePickerController()
        pickerController.delegate = self
        present(pickerController, animated: true, completion: nil)
    }

扩展以获取媒体数据(在这一部分中,我必须添加@objc):

extension MyViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]) {
        if let image = info["UIImagePickerControllerOriginalImage"] as? UIImage {
            selectedImage = image
            profileImage.image = image
        }
        dismiss(animated: true, completion: nil)
    }
}

关于@objc from doc

  

将此属性应用于可以在其中表示的任何声明   Objective-C-例如,非嵌套类,协议,非泛型   枚举(限于整数原始值类型),属性和   类,协议和方法的方法(包括获取器和设置器)   协议,初始化程序和下标的可选成员。目标   属性告诉编译器可以在其中使用声明   Objective-C代码。