疎なドキュメントと密なドキュメント
ドキュメントのカスタマイズでいろいな事が少し解ってきた。そこをもう少し掘り下げてみたいと思う
makeWindowControllersの中で何をすれば良いの?
まず最初に躓いたのが、File's Ownerを
NSDocumentのサブクラスにしても、
NSWindowControllerのサブクラスにしても、WindowControllerの
ownerメソッドが返す値は自分自身だったということ。
これはハマりました。
そこで、
makeWindowControllersの中で呼び出すべきメッセージをよく調べてみると、
- initWithWindowNibName:
- initWithWindowNibName:owner:
の2種類があるじゃ無いですか。 では、どっちを使ったら良いんだろう?と言うわけで早速実験。
initWithWindowNibName:の場合
ログは割愛しますが、この場合、
NSDocumentのメソッドであるはずの、
- windowControllerWillLoadNib:
- windowControllerDidLoadNib:
が、
NSWindowControllerのサブクラス内で呼ばれます。
加えて、
awakeFromNibもWindowControllerの中で呼ばれます。
そして、
NSDocumentのサブクラスでは、上記メソッド群は呼ばれません。
initWithWindowNibName:owner:の場合
この場合は、期待通り(?)
- windowControllerWillLoadNib:
- windowControllerDidLoadNib:
加えて、awakeFromNibが、NSDocumentのサブクラスの 中で呼ばれます。
そして共通で起きること
でもって、どちらの場合も、NSWindowControllerのサブクラスのownerメソッドは、WindowControllerのインスタンス自身を帰します。
と、言うわけで
上の結論を踏まえて、initWithWindowNibName:をどう使い分ければ良いか?というと、
- ドキュメントとGUIを徹底的に切り離し、移植性を高めたいときは、initWithWindowNibName:を使った方が良い
- ドキュメントから.nib(xib)の内容に積極的にアクセスしたい場合は、initWithWindowNibName:owner:を使った方が良い
のではないかとおもいます。
そしていずれの場合も
initWithWindowNibName:(owner:)して、addWindowControllerした後に、そのNSWindowControllerのサブクラスにsetDocument:selfでWindowControllerとDocumentの連携をする必要がありそうです。
大体ですが、こんな感じだとわかりました。