web-dev-qa-db-ja.com

Swift(iOS)でドキュメントピッカーを実装する

IOSアプリの任意のタイプ(.pdf、.docs、.xlsx、.jpeg、.txt、.rtfなど)機能のファイルを選択したい。 アップロードボタンをクリックすると、アプリがディレクトリを開いてファイルを選択するようにしたい(DocumentsPicker

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

Swiftでこれを行う方法はありますか?

31
user4886069

プロジェクトの機能から、iCloudKey-Sharingの両方を有効にします。

enter image description here

クラスにMobileCoreServicesをインポートし、最後にUIViewController内の次の3つのクラスを拡張しました。

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のみを許可されています。だから、自分に合わせて。

kUTTypePDFkUTTypePNGkUTTypeJPEG ...

また、独自のメニューバーをカスタマイズしたい場合。次のコードを追加し、ハンドラー内で独自の関数をカスタマイズします

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

enter image description here

楽しめ。

54
Alexandros

UIDocumentPickerViewControllerを使用して、ファイルアプリまたはiCloudドライブからファイルを取得できます。

  1. Key-value storageおよびiCloud Documents from iCloud機能:

enter image description here

  1. ドキュメントピッカーを開くView Controllerに次のフレームワークをインポートします。

    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ドライブを表示します。

    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)
    

    ユーザーがより多くの種類のファイルをアプリにインポートできるようにするには、UTTypetypesにさらにNSArraysを追加する必要があります。利用可能なすべてのタイプを確認するには、 TType Docs

IOS 11でドキュメントピッカーが開き、Googleドライブ内のファイルを選択しようとすると、バグによりファイルが無効になる可能性があります。 http://www.openradar.me/2418787

22
pableiros

UIDocumentMenuViewControllerはiOS11以降廃止されました。モーダルビューコントローラーから表示すると、バグが見つかりました。ピッカーの直接的な使用方法は次のとおりです。

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

9
SoftDesigner

これは、ダウンロード/アップロード機能の実装に役立ちます

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

詳しくは Apple Documentation

1
Rajesh

NSURLSessionを使用して、記述したものを実装できます。

表示するターゲットディレクトリをアプリのドキュメントディレクトリに制限する必要があります。アプリには、ファイルシステムへのフルアクセスがありません。

1
Duncan C

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)
}
0
Sachin Daingade