60

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

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

でそうするためのアプローチはありSwiftますか?

4

9 に答える 9

104

iOS 14 の更新: 機能は必要ありません。適切な型で を作成しUIDocumentPickerViewController、デリゲートを実装するだけで完了です。

詳細については、この回答を参照してください。そこからコード:


import UIKit
import MobileCoreServices
import UniformTypeIdentifiers

func selectFiles() {
    let types = UTType.types(tag: "json", 
                             tagClass: UTTagClass.filenameExtension, 
                             conformingTo: nil)
    let documentPickerController = UIDocumentPickerViewController(
            forOpeningContentTypes: types)
    documentPickerController.delegate = self
    self.present(documentPickerController, animated: true, completion: nil)
}


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

ここに画像の説明を入力

クラスにインポートMobileCoreServicesしてから、次の 3 つのクラスを 内で拡張します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)
}

ボタンをクリックします。次のメニューがポップアップします。

メニューピッカー

ドロップボックスの場合。任意の項目をクリックすると。アプリにリダイレクトされ、URL が端末に記録されます。

ここに画像の説明を入力

必要に応じて documentTypes を操作します。私のアプリでは、ユーザーは Pdf のみを許可されています。だから、自分に合わせてください。

kUTTypePDF kUTTypePNG kUTTypeJPEG ...

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

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

ここに画像の説明を入力

楽しめ。

于 2017-02-21T14:54:06.570 に答える
35

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

  1. Key-value storageand iCloud DocumentsfromiCloud機能を有効にします。

ここに画像の説明を入力

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

     import MobileCoreServices
    
     // For iOS 14+
     import UniformTypeIdentifiers
    
  2. から次のメソッドを実装しますUIDocumentPickerDelegate

     func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
          // you get from the urls parameter the urls from the files selected
     }
    
  3. UIDocumentPickerViewControllerファイル ピッカーまたは iCloud ドライブを表示する を作成します。

    // Use this code if your are developing prior iOS 14
    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)
    
    // For iOS 14+
    let documentPicker = UIDocumentPickerViewController(forOpeningContentTypes: [UTType.item], asCopy: false)
    documentPicker.delegate = self
    documentPicker.modalPresentationStyle = .formSheet
    
    self.present(documentPicker, animated: true, completion: nil)
    

ユーザーがより多くの種類のファイルをアプリにインポートできるようにするUTTypeには、types NSArray. 使用可能なすべてのタイプを確認するには、UTType ドキュメントを確認してください。

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

于 2017-12-22T23:50:26.513 に答える
1

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

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

詳細については、Apple のドキュメントを参照してください

于 2016-05-18T10:41:30.717 に答える
0

を使用して記述した内容を実装できますNSURLSession

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

于 2016-05-18T10:39:49.457 に答える