custom - Implementar Selector de documentos en swift(iOS)
uibutton(type:) (5)
Quiero elegir un archivo de cualquier tipo (.pdf, .docs, .xlsx, .jpeg, .txt, .rtf, etc.) en mi aplicación iOS. Al hacer clic en el botón Cargar , quiero que mi aplicación abra un directorio y seleccione archivos ( DocumentsPicker
)
@IBAction pickDocument(sender: UIButton) {
//Open Document Picker
}
¿Algún enfoque para hacerlo en Swift
?
Desde las capacidades de su proyecto, habilite tanto el iCloud
como el Key-Sharing
.
Importe MobileCoreServices
en su clase y finalmente amplíe las siguientes tres clases dentro de su UIViewController:
UIDocumentMenuDelegate,UIDocumentPickerDelegate,UINavigationControllerDelegate
Implementar las siguientes funciones:
public func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) {
let myURL = url as URL
print("import result : /(myURL)")
}
public func documentMenu(_ documentMenu:UIDocumentMenuViewController, didPickDocumentPicker documentPicker: UIDocumentPickerViewController) {
documentPicker.delegate = self
present(documentPicker, animated: true, completion: nil)
}
func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
print("view was cancelled")
dismiss(animated: true, completion: nil)
}
¿Cómo llamar a todo esto? Agregue el siguiente bit de código a su función de clic.
func clickFunction(){
let importMenu = UIDocumentMenuViewController(documentTypes: [String(kUTTypePDF)], in: .import)
importMenu.delegate = self
importMenu.modalPresentationStyle = .formSheet
self.present(importMenu, animated: true, completion: nil)
}
Haga clic en su botón. Aparecerá el siguiente menú ...
En el caso de Dropbox. Al hacer clic en cualquier elemento. Será redirigido a su aplicación y la URL se registrará en su terminal.
Manipule los tipos de documentos a su necesidad. En mi aplicación, los usuarios solo pueden Pdf. Así que, haz lo que quieras.
kUTTypePDF
kUTTypePNG
kUTTypeJPEG
...
También si quieres personalizar tu propia barra de menú. Agregue el siguiente código y personalice su propia función dentro del controlador
importMenu.addOption(withTitle: "Create New Document", image: nil, order: .first, handler: { print("New Doc Requested") })
Disfrútala.
El UIDocumentMenuViewController
está en desuso desde iOS11. También lo encontré con errores cuando se presentó desde un controlador de vista modal. Aquí hay una forma directa de usar el selector:
import MobileCoreServices
private func attachDocument() {
let types = [kUTTypePDF, kUTTypeText, kUTTypeRTF, kUTTypeSpreadsheet]
let importMenu = UIDocumentPickerViewController(documentTypes: types as [String], in: .import)
if #available(iOS 11.0, *) {
importMenu.allowsMultipleSelection = true
}
importMenu.delegate = self
importMenu.modalPresentationStyle = .formSheet
present(importMenu, animated: true)
}
extension AViewController: UIDocumentPickerDelegate, UINavigationControllerDelegate {
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
viewModel.attachDocuments(at: urls)
}
func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
controller.dismiss(animated: true, completion: nil)
}
}
Esto te ayudará a implementar la funcionalidad de descarga / carga.
UIDocumentMenuViewController *importMenu = [[UIDocumentMenuViewController alloc] initWithDocumentTypes:@[@"public.item"] inMode:UIDocumentPickerModeImport | UIDocumentPickerModeExportToService];
Para más información, lea la documentación de Apple.
Podría implementar lo que describe utilizando NSURLSession
.
Tendrá que limitar el directorio de destino que muestra al directorio de documentos de su aplicación. Las aplicaciones no tienen acceso completo al sistema de archivos.
Puede usar UIDocumentPickerViewController
para obtener los archivos de las aplicaciones Archivos o iCloud Drive.
- Active el
Key-value storage
y losiCloud Documents
deiCloud
desde la capacidad deiCloud
:
Importe el siguiente marco en el controlador de vista en el que desea abrir el selector de documentos:
import MobileCoreServices
Implementar el siguiente método de
UIDocumentPickerDelegate
:func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) { // you get from the urls parameter the urls from the files selected }
Cree un
UIDocumentPickerViewController
para mostrar el selector de archivos o iCloud Drive:let types: [String] = [kUTTypePDF as String] let documentPicker = UIDocumentPickerViewController(documentTypes: types, in: .import) documentPicker.delegate = self documentPicker.modalPresentationStyle = .formSheet self.present(documentPicker, animated: true, completion: nil)
Si desea que el usuario pueda importar más tipos de archivos a su aplicación, debe agregar más
UTType
s a lostypes
NSArray
. Para ver todos los tipos disponibles, puede consultar los documentos de UTType
Cuando el selector de documentos se abre en iOS 11 e intenta seleccionar un archivo dentro de Google Drive, es posible que el archivo se deshabilite debido a un error: http://www.openradar.me/24187873