Как отменить выбор фотографии после повторного открытия библиотеки фотографий?
Я использую PHPicker для обработки выбора нескольких изображений.
Когда пользователь первоначально выбирает, например, 3 изображения из библиотеки фотографий, он может повторно открыть библиотеку фотографий и отменить выбор любой из выбранных фотографий. Но я не уверен, как справиться с действием отмены выбора.
Прямо сейчас у меня есть фрагмент кода, который обрабатывает добавление изображений в массив, который затем я показываю в пользовательском интерфейсе.
func makeUIViewController(context: Context) -> some UIViewController {
var configuration = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
configuration.filter = .images // filter only to images
configuration.selectionLimit = 4 // max 4 selection
configuration.preselectedAssetIdentifiers = self.imageIdentifierArray
configuration.selection = .ordered
//print(self.imageIdentifierArray)
let photoPickerViewController = PHPickerViewController(configuration: configuration)
photoPickerViewController.delegate = context.coordinator // Use Coordinator for delegation
return photoPickerViewController
}
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
picker.dismiss(animated: true, completion: nil)
let identifiers = results.compactMap(\.assetIdentifier)
self.parent.imageIdentifierArray = identifiers
// Handle selected photos
for result in results where result.itemProvider.canLoadObject(ofClass: UIImage.self) {
result.itemProvider.loadObject(ofClass: UIImage.self) { [weak self] image, error in
guard let self = self, let image = image as? UIImage else { return }
DispatchQueue.main.async {
selectedPhotos.append(image)
}
}
}
}
Я хотел бы знать, как я могу обновитьselectedPhotos
массив всякий раз, когда пользователь отменяет выбор одной из выбранных фотографий изphoto library
.
Я предполагаю, что проблема в чем-тоresult.itemProvider.canLoadObject
. Потому что, когда я отменяю выбор заранее выбранного изображения в библиотеке фотографий,canLoadObject
возвращаетfalse
и он больше не войдет в цикл for. Он появляется только тогда, когда я повторно выбираю фотографию, выбор которой отменил.
2 ответа
DispatchQueue.main.async {
if let index = selectedPhotos.firstIndex(where: { $0.pngData() == image.pngData() }) {
selectedPhotos.remove(at: index)
}else {
selectedPhotos.append(image)
}
}
просто нужно найти индекс выбранного изображения, и все будет готово.
preselectedAssetIdentifiers имеет результаты, которые не включают поставщиков элементов для предварительно выбранных активов, которые остаются выбранными.
Таким образом, вам необходимо либо сохранить ресурс/изображение или поставщика элементов с предыдущего момента, когда вы его выбрали, и использовать эту кэшированную информацию при нажатии сохраненного идентификатора актива.