Tengo una consulta sobre el método de delegado que no se ha llamado para DocumentPickerViewController, aquí está el fondo, solo necesito importar el recurso disponible desde mi aplicación de archivos y por esa razón estoy usando UIDocumentPickerViewController.
Tengo un ViewController separado al que agrego la vista de documentPickerViewController como subvista y agrego su delegado. El código de mi ViewController es así.
var documentPickerController: UIDocumentPickerViewController! let supportedUTI = [kUTTypeImage,kUTTypeSpreadsheet,kUTTypePresentation,kUTTypeDatabase,kUTTypeFolder,kUTTypeZipArchive,kUTTypeVideo, kUTTypeAudiovisualContent] documentPickerController = UIDocumentPickerViewController.init(documentTypes: supportedUTI as [String], in: .import) documentPickerController.delegate = self documentPickerController.allowsMultipleSelection = false view.addSubview(documentPickerController.view) Ahora, como veo, se abre pickercontroller y cuando toco Cancelar documentPickerWasCancelled se llama, pero cuando selecciono un archivo documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL] no se llama.
Traté de sumergirme aún más para mi sorpresa, lo que veo es en lugar de mostrar mi ViewController al que agrego la vista del selector como subvista si muestro directamente pickerViewController así
UIDocumentPickerViewController *dc = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:[self UTITypes] inMode:UIDocumentPickerModeImport]; dc.delegate = self; [MainVC presentViewController:dc animated:YES completion:nil];ambos métodos de delegado se llaman bien. no entiendo porque ¿Alguien puede ayudarme aquí? ¡¡Gracias por adelantado!!
Así que tuve exactamente el mismo problema, se llama al método de delegado documentPickerWasCancelled pero no se llama a didPickDocumentsAt .
También cabe destacar que cuando moví toda la lógica de delegación/presentación a mi controlador de vista base, los métodos UIPickerDelegate funcionaron como se esperaba. Esto me hizo saber que no había ningún problema de tipo de configuración que bloqueara la funcionalidad.
No estoy exactamente seguro de cuál es el problema, pero parece que si el selector de documentos se presenta en una jerarquía de vista compleja, algo se rompe.
Lo que terminé haciendo para solucionar este problema fue crear una nueva ventana y presentar el selector de documentos allí:
func showDocumentPicker() { let documentTypes = ["public.image", "com.adobe.pdf"] let picker = UIDocumentPickerViewController(documentTypes: documentTypes, in: .import) picker.delegate = self picker.allowsMultipleSelection = true picker.modalPresentationStyle = .formSheet let window = UIWindow(frame: UIScreen.main.bounds) let newWindowBaseVC = UIViewController() newWindowBaseVC.view.backgroundColor = UIColor.clear window.rootViewController = newWindowBaseVC window.windowLevel = UIWindow.Level.alert window.makeKeyAndVisible() newWindowBaseVC.present(picker, animated: false, completion: nil) }La respuesta es simple: esto se hereda de un UIViewController. Si solo agrega la vista de viewController a su vista, no se llama a los métodos delegados. Un ViewController tiene su propio ciclo de vida. Lea aquí: https://developer.apple.com/documentation/uikit/uidocumentpickerviewcontroller
Entonces, disculpas por ser una especie de error. Seguro que puede agregar un sub-viewController que muestre solo su vista. Pero: creo que ese no debería ser el caso de uso. Es un ViewController de pantalla completa que se ajusta a las guías de diseño de Apple. Dicho esto, debes presentarlo con:
func addPicker() { var documentPickerController: UIDocumentPickerViewController! documentPickerController = UIDocumentPickerViewController(documentTypes: [String(kUTTypePDF)], in: .import) documentPickerController.delegate = self documentPickerController.allowsMultipleSelection = false present(documentPickerController, animated: true, completion: nil) }Se han presentado algunos errores en los que el desarrollador descubrió que la vista se descarta antes de que se llame al delegado. Por lo que he visto, este comportamiento se introdujo con ios11 y también ocurrió cuando se presentó viewController. Realmente no puedo decir si esto está solucionado o no, ni si este comportamiento está relacionado con mostrarlo como una subvista. (Creo que de alguna manera está arreglado ya que funciona con un viewController presentado)
De todos modos, debe presentarlo como está escrito anteriormente y listo.
El motivo es que el delegado se desasigna si no lo coloca en una var fuera de la función.
Si se encuentra en un entorno estático, puede crear un delegado de var estático: DocumentPickerDelegateClass, por ejemplo; de lo contrario, en un UIViewController simplemente cree el delegado var: DocumentPickerDelegateClass
En todos los casos, coloque la var en la parte superior, donde no se puede desasignar. Tenga cuidado cuando elija la opción "estática", debe usarla con cuidado.