前回の状態(→「Cocoa Bindings がわからなくなってきた」)からまだ抜け出せない。以下に、今、ハマっている状況を簡単に説明してみる。
モデルとコントローラの構造と関係は以下のようになっている。Feed の entries は配列(NSMutableArray)で Entry のインスタンスを抱えている。Entry のプロパティは文字列(NSString)や日付(NSDate)といったオブジェクトだ。このモデルをアプリの主コントローラが抱えている、という形だ。Atom 形式のデータの構造を扱うアプリを想定している(MacBloggerGlass もその一つ)。
+--------------+ | AppContoller | +--------------+ +--------------+ | feed --------->| Feed | | ... |1 1 +--------------+ +--------------+ +--------------+ | entries -------->| Entry | | ... |1 * +--------------+ +--------------+ | title | | content | | lastUpdate | | ... | +--------------+
やりたいことは、Feed が抱える Entry オブジェクトのデータを表(NSTableView)に写し出すことだ。
Cocoa Bindings を使わないなら、AppController を NSTableView のデータソースにすることになる。これは簡単に言うと、NSTableView から「この行のここの列に表示するデータはどれ?」という問い合わせに AppController が答える方式だ。行と列を指定して、配列に収められたオブジェクトのプロパティを取り出すコードを AppController に実装することになる。
Cocoa Bindings を使えばそのコードを書かなくて済む。NSArrayController を介してモデルとビュー(NSTableView)を結びつけることでコードを書かずに同じことを実現できる……はずなのだが、なんだかうまくいかない。いや、うまく動くときもある。まったく動かないなら間違っていることだけは確実にわかる。けれど、同じように書いたり設定したりしたつもりのものが動いたり動かなかったりすると、かえってわかりにくくなる。
どうやら、肝となるのはモデルとコントローラが KVC と KVO に準拠することらしい。で、KVC に準拠するにはどうすれば良いか、についてはわかってきた。だが、KVO への準拠のための施策が良くわからない。ドキュメント(Key-Value Observing Programming Guide)に Ensuring KVO Compliance という項目があるものの、そこに書かれているのは 2 つの項目だけ。しかもそのうちの 1 つは KVC に準拠しろ、というもの。残る一つがこれ。
(「Key-Value Observing Programming Guide: Ensuring KVO Compliance」より)
- The class must allow automatic observer notifications for the property, or implement manual key-value observing for the property.
これだけじゃなあ。もう少し細かく書いて欲しいよ。(´・ω・`)
とにかく、今日も先には進めていない。明日も、今日の続きで Cocoa Bindings の謎と格闘することになる。
追記@2010-12-08
この記事に書いた問題はひとまず解決した。「Cocoa Bindings の肝は KVC 準拠だ」を参照のこと。
関連リンク
- Kye-Value Coding Programming Guide (Mac OS X Reference Library)
- Key-Value Observing Programming Guide (同上)
0 件のコメント:
コメントを投稿