import UIKit public protocol ImagePickerDelegate: AnyObject { func didSelect(image: UIImage?) async } open class ImagePicker: NSObject { private let pickerController: UIImagePickerController private weak var presentationController: UIViewController? private weak var delegate: ImagePickerDelegate? public init(presentationController: UIViewController, delegate: ImagePickerDelegate) { self.pickerController = UIImagePickerController() super.init() self.presentationController = presentationController self.delegate = delegate self.pickerController.delegate = self self.pickerController.allowsEditing = false self.pickerController.sourceType = .photoLibrary self.pickerController.mediaTypes = ["public.image"] } public func present() { self.presentationController?.present(self.pickerController, animated: true) } private func pickerController(_ controller: UIImagePickerController, didSelect image: UIImage?) { controller.dismiss(animated: true, completion: nil) Task { await self.delegate?.didSelect(image: image) } } } extension ImagePicker: UIImagePickerControllerDelegate { public func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { self.pickerController(picker, didSelect: nil) } public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { guard let image = info[.originalImage] as? UIImage else { return self.pickerController(picker, didSelect: nil) } self.pickerController(picker, didSelect: image) } } extension ImagePicker: UINavigationControllerDelegate { }