import SwiftUI import PhotosUI struct ImagePicker: UIViewControllerRepresentable { @Binding var images: [UIImage] var selectionLimit: Int var onDismiss: (() -> Void)? func makeUIViewController(context: Context) -> PHPickerViewController { var configuration = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared()) configuration.filter = .images configuration.selectionLimit = selectionLimit let picker = PHPickerViewController(configuration: configuration) picker.delegate = context.coordinator return picker } func updateUIViewController(_ uiViewController: PHPickerViewController, context: Context) {} func makeCoordinator() -> Coordinator { Coordinator(self) } class Coordinator: NSObject, PHPickerViewControllerDelegate { let parent: ImagePicker init(_ parent: ImagePicker) { self.parent = parent } func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { let group = DispatchGroup() var newImages: [UIImage] = [] for result in results { group.enter() if result.itemProvider.canLoadObject(ofClass: UIImage.self) { result.itemProvider.loadObject(ofClass: UIImage.self) { (image, error) in if let image = image as? UIImage { newImages.append(image) } group.leave() } } else { group.leave() } } group.notify(queue: .main) { self.parent.images = newImages self.parent.onDismiss?() picker.dismiss(animated: true) } } } }