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
?
A partir des capacités de votre projet, activez les variables iCloud
et Key-Sharing
.
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.
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.
Manipulez les types de documents selon vos besoins. Dans mon application, les utilisateurs autorisés à PDF uniquement. Alors, convenez-vous.
kUTTypePDF
kUTTypePNG
kUTTypeJPEG
...
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") })
Profitez-en.
Vous pouvez utiliser UIDocumentPickerViewController
pour obtenir les fichiers à partir de l'application Fichiers ou de iCloud Drive.
Key-value storage
et iCloud Documents
à partir de iCloud
:Importez la structure suivante sur le contrôleur de vue pour lequel vous souhaitez ouvrir le sélecteur de documents:
import MobileCoreServices
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
}
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 UTType
s à la types
NSArray
. 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 .
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:
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
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.