ここでは、RubyCocoa のアプリケーションで扱うデータをファイルに保存することに関してメモしていく。
基本的には、テキストデータを扱うものになると思う。
ファイルへの保存のために、Save パネルを表示してファイルへのパスなどを得る方法はここにメモしてある。ここのページに出てくる panel.filename というのは、Save パネルを使ってファイル名を得たときのもの。
NSString オブジェクトのテキストを保存する
まずは、NSString オブジェクトを文字コードを指定して保存する方法。Ruby の String オブジェクトは to_ns で NSString オブジェクトに変換する。writeToFile_atomically_encoding_error(path,true/false,encoding,error) という NSString オブジェクトを文字コードを指定してテキストファイルとして書き出す。
atomically は、まずバックアップファイルに書き込んでから問題がなければファイル名が指定したものに書き換えられて保存される。要は、安全策をとるかどうか。普通は、true にしといた方が問題ないと思う。path は保存するファイルパスの文字列。文字コードについては、テキストファイルの文字コードを参照。
ここでの例は、Save パネルで .txt ファイルを保存する設定にした場合に得られる panel.filename を使って @text という NSString オブジェクトのテキストを保存する。
nsString = rubyText.to_ns
nsString.writeToFile_atomically_encoding_error(panel.filename,true,NSUTF8StringEncoding,nil)
これ以外に、NSData に変換してから保存する方法もある。まず、dataUsingEncoding(encoding) というメソッドで、NSData オブジェクトに変換する。その後、writeToFile_atomically(path,true/false) というメソッドを使って、NSData オブジェクトをファイルに保存する。他ののファイルタイプと選択でテキスト保存できるようにする場合などには、一度 NSData に変換した方が扱いやすいかも。
textData = nsString.dataUsingEncoding(NSUTF8StringEncoding)
textData.writeToFile_atomically(panel.filename,true)
NSAttributedString オブジェクトの装飾付きテキストを保存する
NSAttributedString (NSMutableAttributedString でもいいはず)オブジェクトのテキストをフォント、スタイルなどの文字情報を保持したまま保存するには、上でもちょっと触れたように、一度 NSData オブジェクトに変換してから保存する。
Cocoa では、RTF と Word 文書形式で保存できる。RTF にするには RTFFromRange_documentAttributes(range,attributes) を使い、Word 文書にするにはdocFormatFromRange_documentAttributes(range,attributes) を使う。どちらも範囲の指定がある。文字情報を特に追加しない場合は、attribute は nil でいい。
ここでの例は、attributedText という NSAttributedString(NSMutableAttributedString でもいいはず)オブジェクトを Save Panel を使って得たパス、panel.filename に保存する。文字情報は追加しない。RTF のデータは rtfText、Word 文書形式のデータは wordData とする。range は NSRange オブジェクトだけど、保存する文字列の最初位置と文字列の長さの Array オブジェクトでもいい。
rtfText = attributedText.RTFFromRange_documentAttributes([0,attributedText.length],nil)
rtfText.writeToFile_atomically(panel.filename,true)
wordText = attributedText.docFormatFromRange_documentAttributes([0,attributedText.length],nil)
wordText.writeToFile_atomically(panel.filename,true)
どちらの場合も、[0,attributedText.length] は NSRange.new(0,attributedText.length) と書いてもいいんだけど、面倒くさいので Array オブジェクトでいい。
NSTextView のテキストを保存する
NSTextView に表示されているテキストをプレインテキストで保存する場合は、string というメソッドで NSString オブジェクトとしてテキストを取り出して処理する。@textView という NSTextView からの場合は次のようになる。
@textView.string.writeToFile_atomically_encoding_error(panel.filename,true,NSUTF8StringEncoding,nil)
もしくは、dataUsingEncoding(encoding) で NSData オブジェクトに変換してから保存する。
textData = @textView.string.dataUsingEncoding(NSUTF8StringEncoding)
textData.writeToFile_atomically(panel.filename,true)
RTF の場合は、NSTextView から RTFFromRange というメソッドで直接 RTF の NSData オブジェクトに変換できるので、それを保存する。
rtfText = @textView.RTFFromRange([0,@textView.string.length])
rtfText.writeToFile_atomically(panel.filename,true)
Word 文書形式の場合は、直接のメソッドがないので、attributedString で NSTextView から テキストを NSAttributedString オブジェクトとして取り出して、それを Word 形式の NSData に変換して保存する。
wordText = @textView.attributedString.docFormatFromRange_documentAttributes([0,@textView.string.length],nil)
wordText.writeToFile_atomically(panel.filename,true)
もしかしたら、もっといい方法があるかもしれないけど、とりあえずはこんなところで。