在swift中实现文档选择器(iOS)

时间:2016-05-18 10:30:12

标签: ios swift uidocumentpickervc

我想在我的iOS应用中选择任何类型的文件(.pdf,.docs,.xlsx,.jpeg,.txt,.rtf等)。点击上传按钮,我希望我的应用打开目录并选择文件(DocumentsPicker

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

Swift中执行此操作的方法是什么?

9 个答案:

答案 0 :(得分:51)

根据您项目的功能,同时启用iCloudKey-Sharing

enter image description here

在您的类中导入MobileCoreServices,最后在UIViewController中扩展以下三个类:

UIDocumentMenuDelegate,UIDocumentPickerDelegate,UINavigationControllerDelegate

实施以下功能:

 public func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
              guard let myURL = urls.first else {
                   return
              }
              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)
    }

如何调用所有这些?将以下位代码添加到您的点击功能..

func clickFunction(){

let importMenu = UIDocumentMenuViewController(documentTypes: [String(kUTTypePDF)], in: .import)
            importMenu.delegate = self
            importMenu.modalPresentationStyle = .formSheet       
            self.present(importMenu, animated: true, completion: nil)
}

单击您的按钮。将弹出以下菜单..

MenuPicker

在DropBox的情况下。点击任何项目。您将被重定向回您的应用程序,并且该URL将记录在您的终端中。

enter image description here

根据需要操作documentTypes。在我的应用程序中,用户只允许使用Pdf。所以,适合自己。

kUTTypePDF kUTTypePNG kUTTypeJPEG ...

此外,如果您想要自定义自己的菜单栏。添加以下代码并在处理程序

中自定义您自己的函数
        importMenu.addOption(withTitle: "Create New Document", image: nil, order: .first, handler: { print("New Doc Requested") })

enter image description here

享受它。

答案 1 :(得分:22)

您可以使用UIDocumentPickerViewController从文件应用或iCloud Drive中获取文件。

  1. Key-value storage功能
  2. 激活iCloud DocumentsiCloud

    enter image description here

    1. 在要打开文档选择器的视图控制器上导入以下框架:

      import MobileCoreServices
      
    2. UIDocumentPickerDelegate

      实施以下方法
      func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
           // you get from the urls parameter the urls from the files selected
      }
      
    3. 创建UIDocumentPickerViewController以显示文件选择器或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)
      

      如果您希望用户可以向您的应用导入更多类型的文件,则必须向UTType types添加更多NSArray个。要查看所有可用类型,您可以查看UTType Docs

    4. 当在iOS 11上打开文档选择器并且您尝试在Google云端硬盘中选择一个文件时,由于错误导致文件被禁用:http://www.openradar.me/24187873

答案 2 :(得分:9)

自iOS11起,UIDocumentMenuViewController已过时。从模态视图控制器显示时,我也发现它有问题。 这是使用选择器的直接方法:

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

像往常一样,别忘了添加iCloud支持:iCloud support

答案 3 :(得分:3)

UIDocumentPickerViewController(documentTypes: [String], in: UIDocumentPickerMode) 在 iOS 14.0 中被弃用

现在是 UIDocumentPickerViewController(forOpeningContentTypes: [UTType])

ContentTypes 是以下任何一种或组合:(UTType.image, UTType.text, UTType.plainText, UTType.utf8PlainText, UTType.utf16ExternalPlainText, UTType.utf16PlainText, UTType.delimitedText, UTType.commaSeparatedText, UTType.commaSeparatedText tabSeparatedText、UTType.utf8TabSeparatedText、UTType.rtf、UTType.pdf、UTType.webArchive、UTType.image、UTType.jpeg、UTType.tiff、UTType.gif、UTType.png、UTType.bmp、UTType.ico、UTType.rawImage、 UTType.svg、UTType.livePhoto、UTType.movi​​e、UTType.video、UTType.audio、UTType.quickTimeMovie、UTType.mpeg、UTType.mpeg2Video、UTType.mpeg2TransportStream、UTType.mp3、UTType.mpeg4Movie、UTType.mpeg4Audio avi、UTType.aiff、UTType.wav、UTType.midi、UTType.archive、UTType.gzip、UTType.bz2、UTType.zip、UTType.appleArchive、UTType.spreadsheet、UTType.epub)

这对我来说是这样的:

let supportedTypes = [myArrayFromAnyOfTheAbove]

func openDocument() {
    let documentPicker = UIDocumentPickerViewController(forOpeningContentTypes: supportedTypes, asCopy: true)
    documentPicker.delegate = self
    documentPicker.allowsMultipleSelection = false
    documentPicker.shouldShowFileExtensions = true
    present(documentPicker, animated: true, completion: nil)
}

答案 4 :(得分:1)

您可以使用NSURLSession实现您所描述的内容。

您必须将显示的目标目录限制在应用程序的文档目录中。应用没有对文件系统的完全访问权限。

答案 5 :(得分:1)

这将有助于您实现下载/上传功能

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

更多阅读Apple Documentation

答案 6 :(得分:0)

iCloud访问所有类型的文件#

func openiCloudDocuments(){
    let importMenu = UIDocumentPickerViewController(documentTypes: [String("public.data")], in: .import)
    importMenu.delegate = self
    importMenu.modalPresentationStyle = .formSheet
    self.present(importMenu, animated: true, completion: nil)
}

答案 7 :(得分:0)

我苦恼的是如何为PickerView指定一些特定格式,例如.pptx和.xlsx文件。这是一些代码,用于创建具有一些常用类型的PickerView ...

let types: [String] = [
    kUTTypeJPEG as String,
    kUTTypePNG as String,
    "com.microsoft.word.doc",
    "org.openxmlformats.wordprocessingml.document",
    kUTTypeRTF as String,
    "com.microsoft.powerpoint.​ppt",
    "org.openxmlformats.presentationml.presentation",
    kUTTypePlainText as String,
    "com.microsoft.excel.xls",
    "org.openxmlformats.spreadsheetml.sheet",
    kUTTypePDF as String,
    kUTTypeMP3 as String
]
let documentPicker = UIDocumentPickerViewController(documentTypes: types, in: .import)
documentPicker.delegate = self
documentPicker.modalPresentationStyle = .formSheet
self.present(documentPicker, animated: true, completion: nil)

我发现有两个地方可以用来整理此列表:

https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html

https://escapetech.eu/manuals/qdrop/uti.html

希望对别人有帮助!

答案 8 :(得分:-1)

let docsTypes = ["public.text",
                          "com.apple.iwork.pages.pages",
                          "public.data",
                          "kUTTypeItem",
                          "kUTTypeContent",
                          "kUTTypeCompositeContent",
                          "kUTTypeData",
                          "public.database",
                          "public.calendar-event",
                          "public.message",
                          "public.presentation",
                          "public.contact",
                          "public.archive",
                          "public.disk-image",
                          "public.plain-text",
                          "public.utf8-plain-text",
                          "public.utf16-external-plain-​text",
                          "public.utf16-plain-text",
                          "com.apple.traditional-mac-​plain-text",
                          "public.rtf",
                          "com.apple.ink.inktext",
                          "public.html",
                          "public.xml",
                          "public.source-code",
                          "public.c-source",
                          "public.objective-c-source",
                          "public.c-plus-plus-source",
                          "public.objective-c-plus-​plus-source",
                          "public.c-header",
                          "public.c-plus-plus-header",
                          "com.sun.java-source",
                          "public.script",
                          "public.assembly-source",
                          "com.apple.rez-source",
                          "public.mig-source",
                          "com.apple.symbol-export",
                          "com.netscape.javascript-​source",
                          "public.shell-script",
                          "public.csh-script",
                          "public.perl-script",
                          "public.python-script",
                          "public.ruby-script",
                          "public.php-script",
                          "com.sun.java-web-start",
                          "com.apple.applescript.text",
                          "com.apple.applescript.​script",
                          "public.object-code",
                          "com.apple.mach-o-binary",
                          "com.apple.pef-binary",
                          "com.microsoft.windows-​executable",
                          "com.microsoft.windows-​dynamic-link-library",
                          "com.sun.java-class",
                          "com.sun.java-archive",
                          "com.apple.quartz-​composer-composition",
                          "org.gnu.gnu-tar-archive",
                          "public.tar-archive",
                          "org.gnu.gnu-zip-archive",
                          "org.gnu.gnu-zip-tar-archive",
                          "com.apple.binhex-archive",
                          "com.apple.macbinary-​archive",
                          "public.url",
                          "public.file-url",
                          "public.url-name",
                          "public.vcard",
                          "public.image",
                          "public.fax",
                          "public.jpeg",
                          "public.jpeg-2000",
                          "public.tiff",
                          "public.camera-raw-image",
                          "com.apple.pict",
                          "com.apple.macpaint-image",
                          "public.png",
                          "public.xbitmap-image",
                          "com.apple.quicktime-image",
                          "com.apple.icns",
                          "com.apple.txn.text-​multimedia-data",
                          "public.audiovisual-​content",
                          "public.movie",
                          "public.video",
                          "com.apple.quicktime-movie",
                          "public.avi",
                          "public.mpeg",
                          "public.mpeg-4",
                          "public.3gpp",
                          "public.3gpp2",
                          "public.audio",
                          "public.mp3",
                          "public.mpeg-4-audio",
                          "com.apple.protected-​mpeg-4-audio",
                          "public.ulaw-audio",
                          "public.aifc-audio",
                          "public.aiff-audio",
                          "com.apple.coreaudio-​format",
                          "public.directory",
                          "public.folder",
                          "public.volume",
                          "com.apple.package",
                          "com.apple.bundle",
                          "public.executable",
                          "com.apple.application",
                          "com.apple.application-​bundle",
                          "com.apple.application-file",
                          "com.apple.deprecated-​application-file",
                          "com.apple.plugin",
                          "com.apple.metadata-​importer",
                          "com.apple.dashboard-​widget",
                          "public.cpio-archive",
                          "com.pkware.zip-archive",
                          "com.apple.webarchive",
                          "com.apple.framework",
                          "com.apple.rtfd",
                          "com.apple.flat-rtfd",
                          "com.apple.resolvable",
                          "public.symlink",
                          "com.apple.mount-point",
                          "com.apple.alias-record",
                          "com.apple.alias-file",
                          "public.font",
                          "public.truetype-font",
                          "com.adobe.postscript-font",
                          "com.apple.truetype-​datafork-suitcase-font",
                          "public.opentype-font",
                          "public.truetype-ttf-font",
                          "public.truetype-collection-​font",
                          "com.apple.font-suitcase",
                          "com.adobe.postscript-lwfn​-font",
                          "com.adobe.postscript-pfb-​font",
                          "com.adobe.postscript.pfa-​font",
                          "com.apple.colorsync-profile",
                          "public.filename-extension",
                          "public.mime-type",
                          "com.apple.ostype",
                          "com.apple.nspboard-type",
                          "com.adobe.pdf",
                          "com.adobe.postscript",
                          "com.adobe.encapsulated-​postscript",
                          "com.adobe.photoshop-​image",
                          "com.adobe.illustrator.ai-​image",
                          "com.compuserve.gif",
                          "com.microsoft.bmp",
                          "com.microsoft.ico",
                          "com.microsoft.word.doc",
                          "com.microsoft.excel.xls",
                          "com.microsoft.powerpoint.​ppt",
                          "com.microsoft.waveform-​audio",
                          "com.microsoft.advanced-​systems-format",
                          "com.microsoft.windows-​media-wm",
                          "com.microsoft.windows-​media-wmv",
                          "com.microsoft.windows-​media-wmp",
                          "com.microsoft.windows-​media-wma",
                          "com.microsoft.advanced-​stream-redirector",
                          "com.microsoft.windows-​media-wmx",
                          "com.microsoft.windows-​media-wvx",
                          "com.microsoft.windows-​media-wax",
                          "com.apple.keynote.key",
                          "com.apple.keynote.kth",
                          "com.truevision.tga-image",
                          "com.sgi.sgi-image",
                          "com.ilm.openexr-image",
                          "com.kodak.flashpix.image",
                          "com.j2.jfx-fax",
                          "com.js.efx-fax",
                          "com.digidesign.sd2-audio",
                          "com.real.realmedia",
                          "com.real.realaudio",
                          "com.real.smil",
                          "com.allume.stuffit-archive",
                          "org.openxmlformats.wordprocessingml.document",
                          "com.microsoft.powerpoint.​ppt",
                          "org.openxmlformats.presentationml.presentation",
                          "com.microsoft.excel.xls",
                          "org.openxmlformats.spreadsheetml.sheet",
                         
    
  ]
let documentPicker = UIDocumentPickerViewController(documentTypes: Utils.docsTypes, in: .import)
    documentPicker.delegate = self
    documentPicker.allowsMultipleSelection = true
    present(documentPicker, animated: true, completion: nil)