UIImage должен соответствовать _ObjectiveCBridgeable в обратном вызове PHPickerViewControllerDelegate
Я просмотрел видео WWDC2020, в котором объясняется, как внедрить новый API PHPickerViewController. Я также видел несколько блогов, в которых был показан именно такой код.
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
if let result = results.first, result.itemProvider.canLoadObject(ofClass: UIImage.self) {
result.itemProvider.loadObject(ofClass: UIImage.self) { (image, error) in
DispatchQueue.main.async {
self.parent.didCapture(image)
}
}
} else {
parent.didCapture(nil)
}
}
Однако это не для меня, и ошибка довольно странная.
UIImage должен подтвердить _ObjectiveCBridgable
Я приложу скриншот, потому что это невероятно
Оборудование: чипсет M1
IDE: Xcode 12.4
3 ответа
Перед использованием введите приведенное изображение как UIImage, это должно решить проблему.
if let typeCastedImage = image as? UIImage {
self.parent.didCapture(typeCastedImage)
}
Это зависит от того, как вы работаете со значениями внутри тела функции. Есть две реализации функции loadObject(). Один из них действительно может принимать UIImage.self. В моем случае работает следующий код:
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
if let itemProvider = results.first?.itemProvider, itemProvider.canLoadObject(ofClass: UIImage.self) {
itemProvider.loadObject(ofClass: UIImage.self) { image, error in
if let image = image as? UIImage {
DispatchQueue.main.async {
self.imageViewField.image = image
}
}
}
}
}
Необходимо сделать проверку на соответствие типу UIImage.
Проблема в том, что есть другая функция с тем же именем, которая требует, чтобы класс соответствовал _ObjectiveCBridgeable.
Чтобы заставить компилятор выбрать правильную функцию, вы можете определить тип NSItemProviderReading.Type:
let type: NSItemProviderReading.Type = UIImage.self
result.itemProvider.loadObject(ofClass: type) { image, error in
...
}