ファイルの読み込み-インポート機能を実装してみよう【fileImporter】

この記事は約7分で読めます。
  • iOS:14.0以上
  • XCode(当サイトの環境):15.0.1

fileImporterは、SwiftUIでファイルのインポート機能を提供するためのビューモディファイアです。
ユーザーがデバイス上のファイルを選択し、アプリに取り込むことができます。
以下に、fileImporterの使い方を説明します。

xr:d:DAF4Dep_Opc:67,j:8185716737796769725,t:24041008

ファイル操作で扱うデータモデルの準備

FileDocumentを適用したデータを準備しましょう。
FileDocumentはSwiftUIアプリ内のデータモデルをファイルとして保存するためのプロトコルです。
このプロトコルを使用すると、ファイル形式でデータを永続化し、編集可能なドキュメントを作成することができます。
以下は単純なテキストデータを保存するためのものです。

import SwiftUI
import UniformTypeIdentifiers

struct SmpFileDocument: FileDocument {
    static var readableContentTypes: [UTType] { [.plainText] }
    static var writableContentTypes: [UTType] { [.plainText] }

    var text: String

    init(text: String = "") {
        self.text = text
    }

    init(configuration: ReadConfiguration) throws {
        if let data = configuration.file.regularFileContents {
            text = String(data: data, encoding: .utf8) ?? ""
        } else {
            throw CocoaError(.fileReadCorruptFile)
        }
    }

    func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper {
        let data = text.data(using: .utf8) ?? Data()
        return FileWrapper(regularFileWithContents: data)
    }
}

サンプルプログラム

実際にはインポートとエクスポートの機能はセットで使用することが多いと思いますが、説明を単純にするため、インポートにのみ絞って説明します。

まず、fileImporterを使用するビューを作成し、ボタンなどのUI要素を配置します。このUI要素をタップすると、ファイル選択用のシステムダイアログが表示されます。

import SwiftUI

struct FileImporterSmp: View {
    @State private var text = ""
    @State private var importFile: Bool = false
    
    var body: some View {
        TextField("ファイルの内容", text: $text)
        
        //インポートボタン
        Button("Inport File") {
            // ファイルをインポートするロジックを実装する
            importFile = true
        }
        .fileImporter(isPresented: $importFile,
                      allowedContentTypes: [.plainText],
                      allowsMultipleSelection: false
                      
        ) { result in
            switch result {
            case .success(let directory):
                directory.forEach { file in
                    // アクセス権取得
                    let gotAccess = file.startAccessingSecurityScopedResource()
                    if !gotAccess { return }
                    
                    // ファイルの内容を取得する
                    do {
                        text = try String(contentsOf: file)
                    } catch {
                        print(error.localizedDescription)
                    }
                    print(text)
                    
                    // アクセス権解放
                    file.stopAccessingSecurityScopedResource()
               }
            case .failure(let error):
                print(error.localizedDescription)
            }
        }
        onCancellation: {
            print("cancell success")
        }
    }
}

inport Fileボタンをタップすると、ファイルブラウザが開きます。
“File1″にはあらかじめ”Naiyo1″というテキストが書き込まれており、タップして選択します。
インポートしたファイルからテキストを読み込むことで、”Naiyo1″が表示されます。

また、view2右上のcancelボタンをタップするとcancel successというメッセージが表示されます。

view1
view2
view3

プログラムの解説

fileImporterのパラメータ

  • isPresented:インポータービューの表示状態を制御するブール値を提供します。trueに設定すると、ファイル選択用のダイアログが表示されます。
  • allowedContentTypes:ユーザーが選択できるファイルのコンテンツタイプを指定します。例えば、.imageを指定すると、画像ファイルのみが選択可能になります。
    プログラム例ではplainText、テキストファイルを指定しています。
  • allowsMultipleSelection:ユーザーがインポートする複数のファイルを選択できるか指定します。trueで選択可能
  • onCancellation:ユーザーがファイルの選択をキャンセルした場合に実行されるクロージャーを指定するためのものです。ユーザーがファイル選択ダイアログを閉じてファイルを選択せずにキャンセルした場合に、このクロージャーが呼び出されます。

ハンドラー

fileImporterビューモディファイアには、クロージャーが含まれています。このクロージャーは、ユーザーがファイルを選択してインポートした後に実行されます。
クロージャーの引数であるresultには、選択されたファイルのURL(ディレクトリ)が含まれます。
このURLを使用して、ファイルの読み込み処理やその他の操作を行うことができます。

アクセス権の操作

取得したURLは以下のメソッドを使用してアクセス権の取得と解放を行います。操作する前に、startAccessingSecurityScopedResourceを呼び出し、操作が完了したらstopAccessingSecurityScopedResourceを呼び出します。

  • startAccessingSecurityScopedResource
  • stopAccessingSecurityScopedResource

まとめ

以上が、fileImporterの基本的な使い方とパラメータに関する解説です。このビューモディファイアを使用することで、ユーザーがファイルを選択してアプリにインポートするシンプルなインターフェースを提供することができます。

タイトルとURLをコピーしました