質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.61%

DocumentsDirectoryを利用したrtfファイルの保存、読み込みについて

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 638

score 12

実現したいこと

attributedtextをrtfdファイルとして保存すること

背景

現在まで、画像を含んだattributedTextをシリアライズしてuserdefaultに保存していました。
しかし、その方法だと画像が増えるとフリーズや重くなったり、という現象が発生したので、他の方法を探してみました。現在までの方法

試してみた方法

DocumentsDirectoryを利用したファイルの保存方法
参考1
参考2

該当コード

import UIKit
import RealmSwift
import CoreLocation
class HenshuuViewController:UIViewController,CLLocationManagerDelegate, UITextFieldDelegate,UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextViewDelegate{

省略

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        super.viewDidLoad()
        do{
          let attritext = try rtf読み込み処理()
             textView.attributedText = attritext

        }catch{print("a")}
}


  //MARK:-アトリビュート保存処理
    func アトリビュート保存処理(textview:UITextView,forkey:String){
     // ドキュメントディレクトリの「ファイルURL」(URL型)定義
        do {
            let file = try textView.attributedText.fileWrapper(from: NSRange(location: 0, length: (textView.attributedText.length)), documentAttributes: [.documentType: NSAttributedString.DocumentType.rtf])
            saveData(data: file)
        } catch {
            ///
        }
    }


    func saveData(data: FileWrapper){
        let file_name = "test.rtf"

        if let dir = FileManager.default.urls( for: .documentDirectory, in: .userDomainMask ).first {

            let path_file_name = dir.appendingPathComponent( file_name )

            do {
                print("保存完了")
                try data.write(to: path_file_name, options: .atomic, originalContentsURL: nil)
            } catch {
                //エラー処理
            }
        }    
    }


//MARK:-アトリビュートテキスト読み込み処理
// ドキュメントディレクトリの「ファイルURL」(URL型)定義
    func rtf読み込み処理() throws -> NSAttributedString{
        var terms = Data()
        //ディレクトリフォルダの指定
        do{
            let url =   FileManager.default.urls( for: .documentDirectory, in: .userDomainMask )[0]

            //ディレクトリフォルダのファイル名まで指定
            let name =  url.appendingPathComponent("test.rtf")
            terms = try Data(contentsOf: name)

        }catch{

        throw FileError.faildRead
        }
            do{
                let attributeString = try NSAttributedString(data: terms, options: [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.rtf], documentAttributes: nil)
                print(attributeString)
            return  attributeString
        }catch  {
            print("ファイルの読み込みに失敗しました: \(error.localizedDescription)")
            throw FileError.faildRead

        }


    }
    enum FileError: Error {
        case notExitPath
        case faildRead
    }

省略
}

困っていること

テキスト情報は保存・読み込み出来るのですが画像が読み込み出来ずに困っています。
いろいろ考えてみたのですが自分では見当がつかず質問させていただきました。
ご教授頂けるとありがたいです。宜しくおねがいします。

追記

DocumentTypeをrtfとして保存すると読み込むことができました。
しかし、DocumentTypeをrtfdとして保存すると読み込むことができませんでした。
その場合、rtfdファイルではなくフォルダが出来ています。
rtfdファイルとして保存すると正常に動くと考えるのですが良い方法が思いつかないです。
わかる方がいましたらヒントだけでも頂ければ嬉しいです。

・DocumentTypeをrtfとした場合
rtfは正常に保存されている?

・DocumentTypeをrtfdとした場合
イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

そもそものところから出来てないようなので一番最初に立ち返りましょう。
あなたの目的はStyled Textを永続化させることです。
そのために考えられる方法は

  1. そういうライブラリを探す
  2. 自分で作り出す

です。いずれかを選んで頑張ってください。

2.に関してはNSAttributedStringが下記のようなメソッドを持っているので、これを使ってゴリゴリ書くことになると思います。
https://developer.apple.com/documentation/foundation/nsattributedstring/1412070-enumerateattributes


FileWrapperを保存しているのにDataとして読み込もうとしているからです
FileWrapperとして読み込んでください
https://developer.apple.com/documentation/foundation/filewrapper/1415658-init

ソースを追っていないので外していたら申し訳ないですけど、
FileWrapperはディレクトリ構造を持つ書類を単一のインスタンスで扱うためのクラスです
その辺は理解できていますか?

というかそもそもiOSだとNSAttributedStringがRTF/RTFDをサポートしてなかったと思うんですけど、それはクリアできていますか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/08 14:44

    お返事ありがとうございます、FileWrapperへの理解が足りていませんでした。
    もう一度勉強し直そうと思います。

    >iOSだとNSAttributedStringがRTF/RTFDをサポートしてなかった
    知らなかったです。
    イメージとしては純正メモのようなテキストや画像を貼れるノートを作りたいのですが、なにかいい方法をご存知であればヒントだけでも教えて頂けると嬉しいです。

    キャンセル

  • 2020/06/08 19:06

    わかりやすく教えていただきありがとうございます。
    ライブラリ、というのはxcodeを拡張させるソフトウェアのようなものなのですね。
    わからないことばかりなので勉強して理解していきたいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る