Document-based アプリケーションを作る その4

基本的にここに書いてあるのは、Document-based アプリケーションを作る その2の焼き直し。でも、バインディングの方法がちょっと違う。

Document-based アプリケーションを作るでは、ファイルの内容を読み込んでそれを Text View に表示させるのに、NSTextView のメソッドを使ってやった。Document-based アプリケーションを作る その2では、NSTextView の AttributedString のバインディングを NSObjectController を介して使った。今回は、同様に NSObjectController を使うんだけど、AttributedString ではなく、URL を直接指定してしまう。ただし、この方法だと、文書を保存するときには、一工夫が必要になる。まあ、こういう方法もあるよ、ということで。

まず、Xcode でターゲットの情報を見るで、書類のタイプに MS ワード文書というのを追加する。とりあえず拡張子は doc のみ。

次に Interface Builder で Object Controller を MyDocument.nib に追加する。ちなみに、Xcode 3.2 というか Snow Leopard に付いてくるバージョンからは、.xib が標準になっている。これは、アプリケーションをビルドすると nib になるので、同じものとして考えていい。まあ、扱いは同じ。

追加したら、どうせなので名前をつけておく。

MyDocument.rb にこの Object Controller の outlet を作り、結びつける。ここでは textViewController にした。

次に、Inspector の Attributes で key を追加する。今回は、Text View に表示する Attributed String だけなので、ひとつ url というのを追加する。それと、Prepare Content にチェックを入れる。

最後に、Text View をこれにバインドする。Inspector の Bindings で Value の Attributed String を開き、TextView Controller にバインドして Model Key Path は上で作った text にする。

これで、Interface Builder 上の作業は終わり。次はスクリプトの方をいじる。

def windowControllerDidLoadNib(aController)

end

で、self.fileURL とすると、選んだファイルの URL が得られるので、これを textViewController の url に設定する。NSObjectController.content は NSDictionary であるので、次のように書くことで新たなオブジェクトとして設定するのではなく、既にあるオブジェクトの中身を書き換えることができる。この場合は、上で Prepare Content にチェックが入っていないとエラーが出る。

@textViewController.conetnt["url"] = self.fileURL

という訳で、前回のスクリプトをちょっと書き換えて、こんなスクリプトになる。

require 'osx/cocoa'

include OSX

class MyDocument < NSDocument

ib_outlet :textView, :textViewController

def windowNibName

return "MyDocument"

end

def windowControllerDidLoadNib(aController)

super_windowControllerDidLoadNib(aController)

if self.fileName

if self.fileType == "リッチテキスト" || self.fileType == "MS ワード文書"

@textView.setRulerVisible(true)

elsif self.fileType == "プレインテキスト"

@textView.setRichText(false)

end

@textViewController.content['url'] = self.fileURL

else

@textView.setRulerVisible(true)

end

end

end