Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

544
Views
Método UIDocumentPickerDelegate (didPickDocumentsAt) no llamado por iOS

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!!

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

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) }
over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!