web-dev-qa-db-fra.com

Implémenter le sélecteur de documents dans Swift (iOS)

Je souhaite choisir un fichier de n'importe quel type de fonctionnalité (.pdf, .docs, .xlsx, .jpeg, .txt, .rtf, etc.) dans mon application iOS. En cliquant sur le bouton Upload , je veux que mon application ouvre un répertoire et sélectionne des fichiers (DocumentsPicker)

@IBAction pickDocument(sender: UIButton) {
    //Open Document Picker
}

Toute approche pour le faire dans Swift?

20
Nilesh Pol

A partir des capacités de votre projet, activez les variables iCloud et Key-Sharing.

 enter image description here

Importez MobileCoreServices dans votre classe et étendez enfin les trois classes suivantes dans votre UIViewController:

UIDocumentMenuDelegate,UIDocumentPickerDelegate,UINavigationControllerDelegate

Implémentez les fonctions suivantes:

 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)
    }

Comment appeler tout ça? Ajoutez le code suivant à votre fonction 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)
}

Cliquez sur votre bouton. Le menu suivant apparaîtra.

 MenuPicker

Dans le cas de DropBox. En cliquant sur un élément. Vous serez redirigé vers votre application et l'URL sera enregistrée dans votre terminal.

 enter image description here

Manipulez les types de documents selon vos besoins. Dans mon application, les utilisateurs autorisés à PDF uniquement. Alors, convenez-vous.

kUTTypePDFkUTTypePNGkUTTypeJPEG...

Aussi, si vous avez envie de personnaliser votre propre barre de menus. Ajoutez le code suivant et personnalisez votre propre fonction dans le gestionnaire 

        importMenu.addOption(withTitle: "Create New Document", image: nil, order: .first, handler: { print("New Doc Requested") })

 enter image description here

Profitez-en.

44
Alexandros

Vous pouvez utiliser UIDocumentPickerViewController pour obtenir les fichiers à partir de l'application Fichiers ou de iCloud Drive.

  1. Activez les fonctionnalités Key-value storage et iCloud Documents à partir de iCloud:

enter image description here

  1. Importez la structure suivante sur le contrôleur de vue pour lequel vous souhaitez ouvrir le sélecteur de documents:

    import MobileCoreServices
    
  2. Implémentez la méthode suivante à partir de UIDocumentPickerDelegate:

    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
         // you get from the urls parameter the urls from the files selected
    }
    
  3. Créez une UIDocumentPickerViewController pour afficher le sélecteur de fichier ou le lecteur iCloud:

    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 vous voulez que l'utilisateur puisse importer plus de types de fichiers dans votre application, vous devez ajouter plus de UTTypes à la typesNSArray. Pour voir tous les types disponibles, vous pouvez vérifier la documentation UTType

Lorsque le sélecteur de documents s'ouvre sur iOS 11 et que vous essayez de sélectionner un fichier dans Google Drive, il est possible que le fichier soit désactivé en raison d'un bogue: http://www.openradar.me/24187873 .

20
pableiros

La UIDocumentMenuViewController est obsolète depuis iOS11. Je l'ai également trouvé buggy quand présenté à partir d'un contrôleur de vue modale . Voici un moyen direct d'utiliser le sélecteur:

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)
    }
}

Comme d'habitude, n'oubliez pas d'ajouter le support iCloud:  iCloud support

4
SoftDesigner

cela vous aidera à implémenter la fonctionnalité de téléchargement 

UIDocumentMenuViewController *importMenu = [[UIDocumentMenuViewController alloc] initWithDocumentTypes:@[@"public.item"] inMode:UIDocumentPickerModeImport | UIDocumentPickerModeExportToService];

Pour plus de lecture Documentation Apple

1
Rajesh

Vous pouvez implémenter ce que vous décrivez en utilisant NSURLSession.

Vous devrez limiter le répertoire cible que vous indiquez au répertoire des documents de votre application. Les applications n'ont pas un accès complet au système de fichiers.

1
Duncan C