Help us understand the problem. What is going on with this article?

NSTextViewを変更したり、保存する

More than 1 year has passed since last update.

In regard to save the NSTextView object, I have not reached a good idea except saving it to a RTFD file after converting a web page to html file. You will find 1. web page to html and 2. Read a RTFD file to NSTextView / Write NSTextView to a RTFD file. I hope these ideas are helpful for you though I have not yet completed the all code. You have to add the NSUR option with %URL encoded at the ❌ line in order to avoid NSUR connection error.
😀I have fixed a huge problem caused with "override func awakeFromNib()" by my big misunderstanding. I removed them into "func applicationDidFinishLaunching(_ aNotification: Notification)". In the case, the clause is repeatedly called when a RTFD file is written.

iOSにあってmacOSにない!

NSAttributedString ⇆ HTML の変換とUITextViewへの表示によると、NSAttributedStringをlet attT = textView.attributedText!のような形式で書けばいいらしいです。
しかし、macOSには、それらしいものが見つかりませんでした。よって、この対応で苦労しています。現時点で、いい線まで来ていますが、残存する摩訶不思議な現象を理解し、問題を解決しないと、安心できません。いろんな組み合わせで検索したのですが、期待しているものにたどり着けませんでした。

1. webViewをNSTextViewに取り込む

まずwebページをstringに読み込み、これをhtml変換してsetします。次は、取り込んだwebページ(string)をhtmlに変換するロジックです。

 let wAtt:NSAttributedString 
 = CallString2html(wX.rString, pEncode:pEncode)  //html & NSAttributedStringに変換。
 pTextView.textStorage?.setAttributedString(wAtt)//NSTextViewにデータをsetする。

func CallString2html(_ pString:String, pEncode:String.Encoding)// <*htmlに変換する*>
    -> NSAttributedString {                             //
 var wEncoded:Data   = Data()                           //文字列をエンコードする。
 if pString.count > 0 {                                 //文字列が存在するとき、
   wEncoded       = pString.data(using:pEncode)!        //文字列をエンコードする。
 } else {                                               //
   wEncoded       = "".data(using:pEncode)!             //""をエンコードする。
 }                                                      //
 let wAttOptions:[NSAttributedString.DocumentReadingOptionKey:Any] 
     = [.documentType:NSAttributedString.DocumentType.html]//❌
 let wAtt:NSAttributedString                            //
     = try! NSAttributedString(data:wEncoded,           //
            options:wAttOptions, documentAttributes:nil)//
 return wAtt                                            //♻️return♻️
}//-----------------------------------------------------//

修正:上記の❌は次のようにURLを%エンコードしたNSURLをsetした方がいいようです。蛇足になりますが、wURLは %エンコードしてあります。このオプションを設定しないと、NSURLConnection finished with errorというエラーが出ます。

let wAttOptions:[NSAttributedString.DocumentReadingOptionKey:Any] = [.documentType:NSAttributedString.DocumentType.html, .baseURL:URL(string:wURL)!]//

2. NSTextViewをどのように保存するか?

ない知恵を絞った結果、RTFDでファイルに保存するのが良さそうなので、今、そのデバッグをやっています。注意事項として、書き込みのとき、trueにするとファイル削除をしてから書き込んでもうまくいかないか、動作が不安定でした。それでfalseにして常に上書きできる設定で進めています。
😊初期処理をawakeFromNibの中にいれたことでRTFDファイルを書き込んだとき、awakeFromNibが実行され、挙動がおかしくなっていました。applicationDidFinishLaunchingに移したら、OKになりました。上記オプションは上書きを自動的にするfalseで問題ないです。

func CallReadRTFD(_ pFilepath:String, pTextView:NSTextView) {//<*RTFDをNSTextViewに*>
 pTextView.readRTFD(fromFile: pFilepath)                     //
}//----------------------------------------------------------//

func CallWriteRTFD(_ pFilepath:String, pTextView:NSTextView) {//<*NSTextViewをRTFDに*>
 let wState:Bool = pTextView.writeRTFD(toFile: pFilepath, atomically: false)//
 if wState == true {                                         //
 } else { }                                                  //
}//----------------------------------------------------------//
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away