Cocoa初心者なのですが、現在Document-Based アプリケーションの設計見直しを行っています。
Documentに関連づけられたWindowController(MyWindowControllerとします。)で、サブクラス化したNSViewController(MyViewControllerとします。)を管理(保持)するようにしています。
しっかりしたMVCになっているか怪しいのですが、ここではMyWindowControllerがデータの箱をもっており、データを変更するときは常にControllerを経由して変更するようにしています。
ここで、MyViewControllerからMyWindowControllerを経由してデータを更新したい場合があるのですが、こういった場合にMyViewControllerからMyWindowControllerに通知を行うにはどのようにするのがよいのでしょうか。
いくつかの方法考えてみました。
- MyViewControllerにMyWindowControllerのポインタ変数を用意する
用意したポインタ変数にアドレスをセットしておく事でMyWindowControllerにアクセスできるようにする。
- MyViewControllerのrepresentedObjectにMyWindowControllerのアドレスをセットしておく
「setRepresentedObject:(id)inObj」でWindowControllerのアドレスをセットしておき、必要なときに「representedObject」で取得してアクセスできるようにする。
- MyViewControllerでモデルへの参照を保持する
MyViewControllerのrepresentedObjectか、独自の変数を用意し、モデルへの参照をViewControllerで保持しておき、WindowControllerを経由せずにデータを更新する。
- すべてのActionをWindowControllerで受け取る
MyWindowControllerにすべてのActionを書くことで、データにアクセスできるようにする。
上記のどの方法でも、データを更新する事は可能ですが、1.、2.の方法だとControllerの階層が深くなると常に自分の親にアクセスできるように参照を保持しないといけなくなりますし、子供が常に親のことを知ってしまっている事にもなります。
3.の方法だと更新したいデータが複数ある場合等はその分の変数が必要になってしまいます。
また、4.の方法だとControllerの肥大化の原因にもなるような気がして、あまり良い設計でないように思います。
このような場合、データを更新するためにViewControllerからWindowControllerに通知を行うためにはどのような方法を取るのが良いでしょうか。
また、Cocoaではどのように行うのが一般的な手法なのでしょうか。
あなたの回答
tips
プレビュー