Как отменить выбор фотографии после повторного открытия библиотеки фотографий?

Я использую 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 имеет результаты, которые не включают поставщиков элементов для предварительно выбранных активов, которые остаются выбранными.

Таким образом, вам необходимо либо сохранить ресурс/изображение или поставщика элементов с предыдущего момента, когда вы его выбрали, и использовать эту кэшированную информацию при нажатии сохраненного идентификатора актива.

Другие вопросы по тегам