【问题标题】:Replacing UIImagePickerController with PHPickerViewController用 PHPickerViewController 替换 UIImagePickerController
【发布时间】:2021-11-03 23:00:35
【问题描述】:

我正在将 UIImagePickerController 替换为 iOS 14 的 PHPickerViewController,但我在使用 PHPickerViewController 在 UI 中显示所选照片时遇到问题。当我从照片库中选择一张照片时,PHPickerViewController 会自行关闭而不更新 UI 中的照片。我一直在尝试各种教程中的不同解决方案,但每次都得到相同的结果。

以下是我目前拥有的代码。 DispatchQueue.main.async 括号内的代码是我一直用于 UIImagePickerController 在 UI 中显示照片的代码。

extension EditProfileController: PHPickerViewControllerDelegate {
    @available(iOS 14, *)

    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        picker.dismiss(animated: true, completion: nil)

        for result in results {
            result.itemProvider.loadObject(ofClass: UIImage.self) { object, error in
                if let image = object as? UIImage {
                    DispatchQueue.main.async {
                        self.profileImageView.image = image
                        self.imageChanged = true
                    }
                }
            }
        }
    }
}

【问题讨论】:

  • 真的应该只在照片成功更新后调用“picker.dismiss(animated: true, completion: nil)”这行吗?在 DispatchQueue 回调中将其移至“self.imageChanged”下方。
  • 不幸的是,这不起作用,只是冻结了 PHPickerViewController。我尝试将它移到其他地方,例如 for 循环的下方和外部,但得到了相同的结果。

标签: ios swift user-interface uiimagepickercontroller phpickerviewcontroller


【解决方案1】:

您的代码没有什么问题。我会这样写,但它几乎是一样的:

func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
    picker.dismiss(animated: true) {
        guard let result = results.first else { 
            print("no results")
            return 
        }
        let prov = result.itemProvider
        guard prov.canLoadObject(ofClass: UIImage.self) else { 
            print("no image")
            return
        }
        prov.loadObject(ofClass: UIImage.self) { object, error in
            if let image = object as? UIImage {
                DispatchQueue.main.async {
                    self.profileImageView.image = image
                    self.imageChanged = true
                }
            } else {
                print(error as Any)
            }
        }
    }
}

像这样尝试,只是作为一个实验,因为我们知道它通常可以工作。使用断点和控制台消息来确保执行路径按照您的预期进行。如果是这样,但图像的显示仍然无法正常工作,我不得不建议问题出在其他地方,在您没有向我们展示的代码中。

【讨论】:

  • 谢谢,马特。我按照你的方法试过了,我在控制台中得到“无图像”。
  • 嗯...这可能是一个与 M1 相关的模拟器错误,基于此线程 -- github.com/expo/expo/issues/11291
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 2022-12-29
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
相关资源
最近更新 更多