【问题标题】:UIImageView is not showing image selected via UIIMagePickerControllerUIImageView 不显示通过 UIIMagePickerController 选择的图像
【发布时间】:2017-03-30 20:24:03
【问题描述】:

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

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

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 图像,那么它可以工作。 谁能帮忙,因为我需要显示通过照片库选择的图像?

【问题讨论】:

  • 我建议删除不必要的dispatch_async 块,并尝试先设置图像,然后才关闭图像选择器。

标签: swift uiimageview uiimagepickercontroller


【解决方案1】:

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

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

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

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

    dismissViewControllerAnimated(true, completion: nil)
}

【讨论】:

  • 我在模拟器中试过了,它对我有用。您是否将 NSPhotoLibraryUsageDescriptiondescriptio‌​n here 添加到您的 info.plist 中?
【解决方案2】:

我认为这段代码可以解决您的问题并使您的照片库中的图片出现:

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)

    }

【讨论】:

    【解决方案3】:

    在 swift 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——例如,非嵌套类、协议、非泛型 枚举(仅限于整数原始值类型)、属性和 类、协议和方法的方法(包括 getter 和 setter) 协议、初始化器和下标的可选成员。对象 属性告诉编译器一个声明可用于 Objective-C 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 2021-03-28
      相关资源
      最近更新 更多