IOSアプリの任意のタイプ(.pdf、.docs、.xlsx、.jpeg、.txt、.rtfなど)機能のファイルを選択したい。 アップロードボタンをクリックすると、アプリがディレクトリを開いてファイルを選択するようにしたい(DocumentsPicker
)
@IBAction pickDocument(sender: UIButton) {
//Open Document Picker
}
Swift
でこれを行う方法はありますか?
プロジェクトの機能から、iCloud
とKey-Sharing
の両方を有効にします。
クラスに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)
}
ボタンをクリックします。次のメニューがポップアップ表示されます..
DropBoxの場合。任意のアイテムをクリックすると。アプリにリダイレクトされ、URLが端末に記録されます。
DocumentTypesを必要に応じて操作します。私のアプリでは、ユーザーはPDFのみを許可されています。だから、自分に合わせて。
kUTTypePDF
kUTTypePNG
kUTTypeJPEG
...
また、独自のメニューバーをカスタマイズしたい場合。次のコードを追加し、ハンドラー内で独自の関数をカスタマイズします
importMenu.addOption(withTitle: "Create New Document", image: nil, order: .first, handler: { print("New Doc Requested") })
楽しめ。
UIDocumentPickerViewController
を使用して、ファイルアプリまたはiCloudドライブからファイルを取得できます。
Key-value storage
およびiCloud Documents
from iCloud
機能:ドキュメントピッカーを開くView Controllerに次のフレームワークをインポートします。
import MobileCoreServices
UIDocumentPickerDelegate
から次のメソッドを実装します。
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
// you get from the urls parameter the urls from the files selected
}
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)
ユーザーがより多くの種類のファイルをアプリにインポートできるようにするには、UTType
types
にさらにNSArray
sを追加する必要があります。利用可能なすべてのタイプを確認するには、 TType Docs
IOS 11でドキュメントピッカーが開き、Googleドライブ内のファイルを選択しようとすると、バグによりファイルが無効になる可能性があります。 http://www.openradar.me/2418787
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)
}
}
これは、ダウンロード/アップロード機能の実装に役立ちます
UIDocumentMenuViewController *importMenu = [[UIDocumentMenuViewController alloc] initWithDocumentTypes:@[@"public.item"] inMode:UIDocumentPickerModeImport | UIDocumentPickerModeExportToService];
詳しくは Apple Documentation
NSURLSession
を使用して、記述したものを実装できます。
表示するターゲットディレクトリをアプリのドキュメントディレクトリに制限する必要があります。アプリには、ファイルシステムへのフルアクセスがありません。
func openiCloudDocuments(){
let importMenu = UIDocumentPickerViewController(documentTypes: [String("public.data")], in: .import)
importMenu.delegate = self
importMenu.modalPresentationStyle = .formSheet
self.present(importMenu, animated: true, completion: nil)
}