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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1676閲覧

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

Daisuke0315

総合スコア23

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/06/08 02:09

編集2020/06/09 05:44

#実現したいこと
attributedtextをrtfdファイルとして保存すること

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

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

#該当コード

swift

1import UIKit 2import RealmSwift 3import CoreLocation 4class HenshuuViewController:UIViewController,CLLocationManagerDelegate, UITextFieldDelegate,UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextViewDelegate{ 5 6省略 7 8override func viewWillAppear(_ animated: Bool) { 9 super.viewWillAppear(animated) 10 super.viewDidLoad() 11 do{ 12 let attritext = try rtf読み込み処理() 13 textView.attributedText = attritext 14 15 }catch{print("a")} 16} 17 18 19 //MARK:-アトリビュート保存処理 20 func アトリビュート保存処理(textview:UITextView,forkey:String){ 21 // ドキュメントディレクトリの「ファイルURL」(URL型)定義 22 do { 23 let file = try textView.attributedText.fileWrapper(from: NSRange(location: 0, length: (textView.attributedText.length)), documentAttributes: [.documentType: NSAttributedString.DocumentType.rtf]) 24 saveData(data: file) 25 } catch { 26 /// 27 } 28 } 29 30 31 func saveData(data: FileWrapper){ 32 let file_name = "test.rtf" 33 34 if let dir = FileManager.default.urls( for: .documentDirectory, in: .userDomainMask ).first { 35 36 let path_file_name = dir.appendingPathComponent( file_name ) 37 38 do { 39 print("保存完了") 40 try data.write(to: path_file_name, options: .atomic, originalContentsURL: nil) 41 } catch { 42 //エラー処理 43 } 44 } 45 } 46 47 48//MARK:-アトリビュートテキスト読み込み処理 49// ドキュメントディレクトリの「ファイルURL」(URL型)定義 50 func rtf読み込み処理() throws -> NSAttributedString{ 51 var terms = Data() 52 //ディレクトリフォルダの指定 53 do{ 54 let url = FileManager.default.urls( for: .documentDirectory, in: .userDomainMask )[0] 55 56 //ディレクトリフォルダのファイル名まで指定 57 let name = url.appendingPathComponent("test.rtf") 58 terms = try Data(contentsOf: name) 59 60 }catch{ 61 62 throw FileError.faildRead 63 } 64 do{ 65 let attributeString = try NSAttributedString(data: terms, options: [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.rtf], documentAttributes: nil) 66 print(attributeString) 67 return attributeString 68 }catch { 69 print("ファイルの読み込みに失敗しました: (error.localizedDescription)") 70 throw FileError.faildRead 71 72 } 73 74 75 } 76 enum FileError: Error { 77 case notExitPath 78 case faildRead 79 } 80 81省略 82} 83

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

#追記

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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 05:01

編集2020/06/08 07:31
MasakiHori

総合スコア3391

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daisuke0315

2020/06/08 05:44

お返事ありがとうございます、FileWrapperへの理解が足りていませんでした。 もう一度勉強し直そうと思います。 >iOSだとNSAttributedStringがRTF/RTFDをサポートしてなかった 知らなかったです。 イメージとしては純正メモのようなテキストや画像を貼れるノートを作りたいのですが、なにかいい方法をご存知であればヒントだけでも教えて頂けると嬉しいです。
Daisuke0315

2020/06/08 10:06

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問